基本上,我希望能够将方法插入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)]返回的错误是
- 错误6参数1:无法从"方法组"转换为"对象"
- 错误7参数2:无法从"方法组"转换为"对象"
- 错误8参数3:无法从"方法组"转换为"对象"
你知道有没有办法让它或类似的东西发挥作用吗?
这就是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类型,而不是委托数组。
这有几个优点。首先,您可以将多种类型的参数传递给测试方法。(在这种情况下不需要,但在我的情况下它很有帮助。)其次,您可以向TestCaseData对象添加更多的属性。在我的例子中,我使用.SetName为每个测试用例添加一个名称,这样NUnit GUI就可以清楚地识别正在运行的测试用例。修改安德斯的例子:
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();
}
正如安德斯所提到的,人们可以使用元组来支持更复杂的论点列表;但我的项目在.Net 3.5中,它不支持Tuples。