Nunit: L'attribut NUnit référençant une version différente de NUnit empêche l'exécution des tests

Créé le 1 janv. 2020  ·  3Commentaires  ·  Source: nunit/nunit

La création d'un attribut personnalisé qui dérive de TestActionAttribute , puis l'utilisation de cet attribut à partir d'une bibliothèque de test qui utilise une version plus récente de NUnit entraînera que NUnit n'exécutera pas le test car il ne pourra pas charger l'ancienne bibliothèque NUnit. L'utilisation d'un app.config pour rediriger vers la nouvelle version de NUnit résout le problème et les tests s'exécutent ensuite comme prévu.

Le problème n'est pas évident car les tests normaux semblent ne pas s'exécuter (statut : non concluant). C'était la cause du problème n° 25 de

An exception was thrown while loading the test.
System.IO.FileLoadException: Could not load file or assembly 'nunit.framework, Version=3.7.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'nunit.framework, Version=3.7.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb'
   at System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type)
   at System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)
   at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
   at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
   at NUnit.Framework.Internal.TypeWrapper.GetCustomAttributes[T](Boolean inherit)
   at NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.GetFixtureBuilderAttributes(ITypeInfo typeInfo)
   at NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo typeInfo)

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

  Exception doesn't have a stacktrace

Le problème sous-jacent - référencer une ancienne version de NUnit pour les attributs - pourrait être fermé comme "ne sera pas corrigé", mais je pense qu'il pourrait être utile pour les utilisateurs d'avoir une sorte de message d'erreur plutôt que de voir les tests refuser apparemment de s'exécuter .

J'ai créé une solution de reproduction sur @ _repo_NUnitAttributesTargettingDifferentVersion

docs enhancement

Commentaire le plus utile

Je suis d'accord avec la conclusion : le fait que les attributs personnalisés soient verrouillés dans la version de NUnit qu'ils étendent n'est pas nouveau, mais n'est pas non plus facilement détectable. pour détecter les versions de framework en conflit et donner un message d'erreur.

De plus, dans la mesure du possible, nous devons documenter comment écrire des attributs personnalisés qui seront rétrocompatibles. Je pense que compter uniquement sur nos interfaces immuables et utiliser une redirection de liaison dans le fichier de configuration fera l'affaire, mais quelqu'un devrait d'abord l'essayer.

Tous les 3 commentaires

Je suis d'accord avec la conclusion : le fait que les attributs personnalisés soient verrouillés dans la version de NUnit qu'ils étendent n'est pas nouveau, mais n'est pas non plus facilement détectable. pour détecter les versions de framework en conflit et donner un message d'erreur.

De plus, dans la mesure du possible, nous devons documenter comment écrire des attributs personnalisés qui seront rétrocompatibles. Je pense que compter uniquement sur nos interfaces immuables et utiliser une redirection de liaison dans le fichier de configuration fera l'affaire, mais quelqu'un devrait d'abord l'essayer.

Je marque cela comme les deux documents, afin que nous puissions les examiner et les améliorer, pour enquêter sur la détection de versions conflictuelles et éventuellement recommander une redirection de liaison.

Je connais moins bien le côté Roslyn, mais est-ce quelque chose qu'un analyseur pourrait détecter ? Ou cela devrait-il être un contrôle d'exécution (message d'erreur amélioré)

Cette page vous a été utile?
0 / 5 - 0 notes