【问题标题】:Is there a way to pass delegates to a NUnit TestCase or TestFixture?有没有办法将委托传递给 NUnit TestCase 或 TestFixture?
【发布时间】:2013-09-01 02:32:24
【问题描述】:

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

你知道是否有任何方法可以让这个或类似的东西工作吗?

【问题讨论】:

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


    【解决方案1】:

    以 Anders 的精彩回答为基础:

    您可以使用 NUnit TestCaseData 类型而不是 Delegates 数组。

    这有几个优点。首先,您可以将多种类型的参数传递给测试方法。 (在这种情况下不需要,但在我的情况下很有帮助。)其次,您可以向 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();
    }
    

    正如 Anders 所提到的,可以使用元组来支持更复杂的参数列表;但我的项目在不支持元组的 .Net 3.5 中。

    【讨论】:

    • 应该是 new TestCaseData( new SimpleDelegate(A), new SimpleDelegate(B), new SimpleDelegate(C) ).SetName("A B C")?上面的语法有问题。
    【解决方案2】:

    这就是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[] 创建强类型参数列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多