2015-03-24 1 views
2

J'ai créé un débogage d'attribut personnalisé il s'est rendu compte qu'il est appelé plusieurs fois même si je n'exécute qu'un seul test. On dirait qu'il s'appelle des attributs pour tous les tests:Constructeur d'attribut d'action de Nunit appelé plusieurs fois

 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | 
       AttributeTargets.Interface | AttributeTargets.Assembly, 
       AllowMultiple = true)] 
    public class DisplayModeAttribute : Attribute, ITestAction 
    { 
     private readonly string screenSize; 

     public DisplayModeAttribute(string screenSize) 
     { 
      this.screenSize = screenSize; 
     } 

     public void BeforeTest(TestDetails details) 
     { 
      PageFactory.SetWindowSize(screenSize); 
     } 

     public void AfterTest(TestDetails details) 
     { 

     } 

     public ActionTargets Targets 
     { 
      get { return ActionTargets.Test | ActionTargets.Suite; } 
     } 
    } 

J'ai trois tests qui utilisent cet attribut avec de petites, grandes valeurs XSmall comme

[DisplayMode("small")] 

Quand je déboguer un test, je remarque que l'attribut Le constructeur est appelé avec toutes les valeurs (petit, grand, xsmall) pour plusieurs fois (environ 40!). Et pour l'appel final, il définit la valeur avec la valeur correcte, par exemple "petit"

Vérification de la pile d'appels Je ne peux pas la voir appelée par qui.

+0

Il est post expliquant quand exécute constructeur attribut personnalisé, basé sur ce mon constructeur devrait obtenir appelé 3 fois (bien qu'ils soient les mêmes types d'attributs avec des arguments différents). Mais dans mon cas, consructor est appelé 40 fois (environ) http://stackoverflow.com/questions/1168535/when-is-custom-attributes-constructor-run – shiva

+0

Où mettez-vous l'attribut? – Ben

Répondre

1

Je ne connais pas les détails de cet attribut, mais il semble que l'intention soit que l'attribut soit exécuté une fois par appel de test. Si tel est le cas, un compte d'instanciation de 40 ne semble pas trop déraisonnable.

Les attributs en C# sont une implémentation de la programmation orientée aspect qui semble être une bonne idée, mais qui peut rapidement devenir difficile à comprendre et difficile à tester. Au lieu d'utiliser un attribut, je recommande d'utiliser une invocation de méthode simple dans la configuration de test, qui, bien que moins "cool", sera plus simple à comprendre pour les autres développeurs lorsqu'ils liront la suite de tests.

Si vous insistez vraiment sur l'utilisation des attributs, puis essayez de changer

get { return ActionTargets.Test | ActionTargets.Suite; } 

être

get { return ActionTargets.Suite; }