【问题标题】:How can I use an NUnit test case that is dependent on TestSetup method having run?如何使用依赖于已运行的 TestSetup 方法的 NUnit 测试用例?
【发布时间】:2017-01-23 14:59:02
【问题描述】:

我正在使用 NUnit 2 为 C# 编写一些单元测试。我的环境是安装了 Resharper 的 Visual Studio 2015 Professional。

我遇到的问题是我尝试使用TestCaseSourceAttribute 创建的一些参数化测试。在简单的情况下,我可以创建可以正常工作的测试:

[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(string name) {
    Assert.IsFalse(String.IsNullOrEmpty(name));
}

private static IEnumerable<TestCaseData> MyTestCases {
    get {
        yield return new TestCaseData("test");
        yield return new TestCaseData("123");
    }
}

但是,当我尝试实例化必须从数据库实体映射或在初始化过程中检查数据库的类型时,测试运行程序会忽略该测试。例如:

[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(MyMappedType instance) {
    Assert.IsTrue(instance.SomeProperty);
}

private static IEnumerable<TestCaseData> MyTestCases {
    get {
        yield return new TestCaseData(GetAnInstanceOfMyMappedType());
        yield return new TestCaseData(GetADifferentInstanceOfMyMappedType());
    }
}

MyMappedType 的实例化如果在测试体本身中就可以正常工作,但如果有任何测试用例实例化它,则测试将被忽略。

我可以让这些测试以参数化的方式工作吗?有关于此的任何文档参考?


更新:

问题似乎是由于测试用例属性中的某些代码依赖于已经运行的类的TestSetup 方法。有没有办法在初始化每个测试用例之前而不是之后运行设置?

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

    不,在生成测试之前无法调用您的设置。

    此外,尽管可以在 TestCaseSource 方法中实例化对象,但只要方法返回,这些对象就会超出范围,除非保存在某个地方,例如静态成员中。当然,这不是一个很好的做法。

    重写您的 TestCaseSource 以提供可用于在运行时创建所需对象的参数,例如整数和字符串。

    如果您只想为每个夹具创建一次这些对象,请使用 OneTimeSetUp 而不是 SetUp,并使用参数化夹具来保存创建它们所需的参数。

    【讨论】:

      【解决方案2】:

      使用 C# 编译器的一个属性,我们可以找到解决这个问题的方法。程序如下:

      1. 以静态方法检索数据
      2. 静态方法放在类的所有其他成员之前
      3. 请务必注意,源每次执行仅完成一次(这是此方法的限制之一)
      4. 测试用例可以使用之前生成的数据。

      【讨论】:

        猜你喜欢
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        相关资源
        最近更新 更多