2013-08-28 74 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。

相关问题