[英]Is there a way to pass delegates to a NUnit TestCase or 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();
}
}
我收到的[TestCase(A,B,C)]的錯誤是
你知道是否有辦法讓這個或類似的東西工作?
這是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[]
來創建強類型參數列表。
建立在安德斯的好答案上:
您可以使用NUnit TestCaseData類型而不是Delegates數組。
這有幾個優點。 首先,您可以將多種類型的參數傳遞給測試方法。 (在這種情況下不需要,但在我的情況下它很有幫助。)其次,您可以向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所提到的,可以使用Tuples來支持更復雜的參數列表; 但我的項目是在.Net 3.5中,它不支持元組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.