2009-09-16 5 views
0

В ходе модульного тестирования, мне нужно, чтобы украсить свои методы с атрибутами испытаний, как показано ниже:Динамически Инъекционный Атрибут к методу

[Test] 
public class when_1_is_passed : specifications_for_prime_test 
    { 
     public void should_return_false() 
     { 
      Assert.AreEqual(1,1); 
     } 
    } 

кодом [Test] атрибуты представляет, что метод является методом тестирования. Я хочу избавиться от атрибута [Test]. В 95% случаев все методы, определенные в наборе тестов, будут методами тестирования. Остальные 5% могут быть кодом инициализации и т. Д.

В любом случае, теперь мне как-то нужно динамически вводить TestAttribute во все методы. У меня есть следующий код, но я не вижу способа для добавления атрибутов в метод.

public static void Configure<T>(T t) 
     { 
      var assemblyName = "TestSuite"; 
      var assembly = Assembly.Load(assemblyName); 

      var assemblyTypes = assembly.GetTypes(); 

      foreach (var assemblyType in assemblyTypes) 
      { 
       if(assemblyType.BaseType == typeof(specifications_for_prime_test)) 
       { 
        // get all the methods from the class and inject the TestMethod attribute 

        var methodInfos = assemblyType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.DeclaredOnly); 
        foreach(var methodInfo in methodInfos) 
        { 
         // now attach the TestAttribute to the method 
        } 
       } 
      } 

      var methodsInfo = t.GetType().GetMethods(); 
     } 

ИЛИ там может быть какая-то скрытая особенность структуры модульного тестирования, которая позволяет пользователю просто поставить атрибут класса и всех методов внутри этого класса становится метод испытания.

Вот что тесты выглядит следующим образом:

[TestFixture] 
    public class specifications_for_prime_test 
    { 
     [SetUp] 
     public void initialize() 
     { 
      UnitTestHelper.Configure(this); 
     } 
    } 

    public class when_1_is_passed : specifications_for_prime_test 
    { 
     public void should_return_false() 
     { 
      Assert.AreEqual(1,1); 
     } 
    } 
+0

У меня возникли трудности с пониманием мотивации для этого. – womp

+0

Я думаю, что мне что-то не хватает, но ваши методы [Test] не были бы в тестовом классе [TestFixture]? Если это так, зачем вам когда-либо удалять атрибуты теста? –

+0

Идея сделать это - удалить вручную, добавив атрибут [Test]. Как только все методы будут иметь атрибут [Test], они будут рассматриваться как Unit Tests. – azamsharp

ответ

2

Что происходит, если вы не украшаете методы тестирования атрибутом Test, а вместо этого вы префикс имени Test-методов Test.

См. this.

NUnit должны признать его в качестве тест-метода, а также, без вас, чтобы украсить метод с TestAttribute Однако, я проверил это с NUnit 2.4.7, и это не похоже, чтобы быть правдой больше.

В любом случае, я не вижу причины, почему это вас беспокоит? В чем проблема с тем, что метод украшен тестовым атрибутом? Это просто делает его явным, что это тест. Мне нравится объяснение :)

+0

Я использую MBUnit, и я просто попробовал, и это не сработало. Вы правы, это не имеет большого значения, чтобы украсить методы атрибутом [Test], но я искал способ его удалить. – azamsharp

+0

«Начиная с версии 2.2.1, тесты старого стиля (« Тест .... ») по умолчанию не распознаются. ** Мы рекомендуем вам преобразовать такие тестовые примеры для использования TestAttribute. ** В качестве альтернативы вы можете укажите параметр в тестовом конфигурационном файле, чтобы разрешить использование тестов по старому стилю по умолчанию ». См. Http://www.nunit.org/index.php?p=upgrade&r=2.5.2. – TrueWill

0

Вы можете использовать TypeDescriptor?

+0

@ Брайан, я проверяю его прямо сейчас! Спасибо – azamsharp

+0

Кажется, что TypeDescriptor может использоваться только для добавления атрибутов на уровне класса. – azamsharp

+0

Слишком плохо. Кажется, что у него есть PropertyDescriptor и EventDescriptor, но нет MethodDescriptor. Странный. Рассматривая проблему под другим углом, можете ли вы рассказать о своей модульной структуре тестирования, какие классы и методы можно тестировать? Если это так, вы можете составить свой собственный список методов и передать его. Не уверен, что это возможно, но было бы неплохо :-) –

Смежные вопросы