2013-08-28 101 views
10

基本上我希望能夠插入NUnit中的TestCase或TestFixture的方法來改變行爲。從本質上說我想這樣做:有沒有辦法將代理傳遞給NUnit TestCase或TestFixture?

[TestFixture] 
public class MethodTests 
{ 
    public delegate void SimpleDelegate(); 

    public static void A() 
    { 
     // Do something meaningful 
    } 

    public static void B() 
    { 
     // Do something meaningful 
    } 

    public static void C() 
    { 
     // Do something meaningful 
    } 

    [TestCase(A,B,C)] 
    [TestCase(C,A,B)] 
    [TestCase(C,B,A)] 
    public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
    { 
     action1(); 
     action2(); 
     action3(); 
    } 
} 

我回來了的誤差[測試用例(A,B,C)]是

  • 錯誤6參數1:不能從 '方法組' 轉換爲 'object'
  • 錯誤7參數2:無法從 '方法組' 轉換爲 'object'
  • 錯誤8參數3:無法從 '方法組' 轉換爲 'object'

你知道是否有什麼方法可以讓這個或者類似的東西起作用?

回答

15

這就是TestCaseSourceAttribute來救援的地方。

首先,定義一個包含測試用例列表的對象數組。接下來,通過引用對象數組來調用測試用例,作爲Test[TestCaseSource]。這應該按照你的意圖建立和運行。

private static readonly object[] TestCases = 
{ 
    new SimpleDelegate[] { A, B, C }, 
    new SimpleDelegate[] { C, A, B }, 
    new SimpleDelegate[] { C, B, A } 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, 
       SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

如果你需要一個更復雜的參數列表,例如,你可以使用Tuple代替SimpleDelegate[]創建強類型的參數列表。

2

大廈Anders的罰款答案:

您可以使用NUnit的TestCaseData類型,而不是代表的陣列。

這有幾個好處。首先,您可以將多種類型的參數傳遞給測試方法。 (在這種情況下不需要,但對我而言有幫助。)其次,您可以向TestCaseData對象添加更多屬性。就我而言,我使用.SetName爲每個測試用例添加一個名稱,以便NUnit GUI明確標識正在運行的測試用例。修改Anders的例子:

private static readonly object[] TestCases = 
{ 
    new TestCaseData(A, B, C).SetName("A B C"), 
    new TestCaseData(C, A, B).SetName("C A B"), 
    new TestCaseData(C, B, A).SetName("C B A") 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

正如Anders所提到的,人們可以使用元組來支持更復雜的參數列表;但我的項目是不支持元組的.Net 3.5。

相關問題