2015-03-24 12 views
2

Я создал настраиваемую отладку атрибутов, и понял, что он вызван так много раз, даже я запускаю только один тест. Похоже, она вызвана для атрибутов для всех тестов:Конструктор атрибутов Nunit Action вызывается несколько раз

 [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; } 
     } 
    } 

У меня есть три испытания, которые используют этот атрибут с маленькими, большими значениями Xsmall в

[DisplayMode("small")] 

Когда я отлаживать тест я заметил, что атрибут конструктор вызываются со всеми значениями (малыми, большими, xsmall) каждый раз много (около 40!). И для окончательного вызова он устанавливает значение с правильным значением, например «small»

Проверка стека вызовов Я не вижу, чтобы он вызывался кем.

+0

Существует пост объяснения, когда пользовательский атрибут конструктора пробегов, основанные на этом мой конструктор должен вызываться 3 раза (хотя они являются одними и теми же типами атрибутов с разными аргументами). Но в моем случае конструктор получает вызов 40 раз (примерно) http://stackoverflow.com/questions/1168535/when-is-a-custom-attributes-constructor-run – shiva

+0

Где вы добавляете атрибут? – Ben

ответ

1

Я не знаю подробностей этого атрибута, но похоже, что целью является запуск атрибута один раз за каждый вызов вызова. Если это так, то количество экземпляров 40 не кажется слишком необоснованным.

Атрибуты на C# - это реализация аспектно-ориентированного программирования, которое звучит как хорошая идея, но может быстро становиться трудным для понимания и испытания.

Вместо использования атрибута я бы рекомендовал использовать прямое вызов метода в тестовой настройке, которая, хотя и не такая «крутая», будет проще понять для других разработчиков, когда они придут, чтобы прочитать набор тестов.

Если вы действительно настаиваете на использовании атрибутов, то попробуйте изменить

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

быть

get { return ActionTargets.Suite; } 
Смежные вопросы