有没有办法将代理传递给NUnit TestCase或TestFixture?

时间:2013-08-28 20:36:02

标签: c# delegates nunit parameterized-unit-test

基本上我希望能够将方法插入到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:无法从“方法组”转换为“对象”

你知道是否有办法让这个或类似的东西起作用?

2 个答案:

答案 0 :(得分:17)

这是TestCaseSourceAttribute拯救的地方。

首先,定义一个包含测试用例列表的对象数组。接下来,通过引用对象数组作为Test的{​​{1}}来调用测试用例。这应该按照您的意图建立并运行。

[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来创建强类型参数列表。

答案 1 :(得分:4)

以安德斯的正确答案为基础:

您可以使用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,不支持元组。