2009-09-16 75 views
0

在單元測試我需要裝飾我的方法使用測試屬性,如下所示:動態注入屬性的方法

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

的[測試]屬性表示的方法是一個測試方法。我想擺脫[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 2009-09-16 20:22:12

+0

我想我可能會錯過一些東西,但是你的[Test]方法不在[TestFixture]測試類中嗎?如果是這樣的話,爲什麼你需要永遠刪除測試屬性? – 2009-09-16 20:23:32

+0

這樣做的想法是刪除手動添加[Test]屬性。一旦所有方法都具有[Test]屬性,它們將被視爲單元測試。 – azamsharp 2009-09-16 20:24:27

回答

2

如果您不使用Test屬性修飾Test方法,而是使用Test前綴Test-methods的名稱,會發生什麼情況。

參見this

NUnit的應該認識到它作爲一個測試方法爲好,而您不必與TestAttribute 但是裝飾方法,我已經NUnit的2.4.7進行了測試,這似乎是不正確的了。

無論如何,我沒有看到這個困擾你的原因嗎?使用測試屬性裝飾方法有什麼問題?這只是明確表示它是一個測試。 我喜歡清晰:)

+0

我使用MBUnit,我試過了,它不起作用。你說得對,用[Test]屬性來裝飾方法並不是什麼大問題,但我正在尋找一種方法來移除它。 – azamsharp 2009-09-16 20:50:33

+0

「從版本2.2.1開始,舊式測試用例(」測試....「)不再被默認識別。**我們建議您將這些測試用例轉換爲使用TestAttribute。**或者,您可以在測試配置文件中指定一個設置,以允許默認使用舊式測試用例。「請參閱http://www.nunit.org/index.php?p=upgrade&r=2.5.2 – TrueWill 2009-09-17 03:36:36

0

你可以利用TypeDescriptor

+0

@Bryan,我正在查看它!謝謝 – azamsharp 2009-09-16 20:42:00

+0

似乎TypeDescriptor只能用於在類級別添加屬性。 – azamsharp 2009-09-16 21:21:33

+0

太糟糕了。它似乎有PropertyDescriptor和EventDescriptor,但沒有MethodDescriptor。奇。從另一個角度來看問題,你能告訴你的單元測試框架哪些類和方法是可測試的嗎?如果是這樣,你可以製作自己的方法列表並將其傳入。不知道這是否可行,但它會很好:-) – 2009-09-16 22:09:57