如何使用依赖于已经运行的TestSetup方法的NUnit测试用例



我正在使用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方法。有没有一种方法可以在初始化每个测试用例之前而不是之后运行安装程序?

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

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

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

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

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

  1. 在静态方法中检索数据
  2. 静态方法放置在类的所有其他成员之前
  3. 需要注意的是,每次执行只能完成一次源代码(这是该方法的限制之一)
  4. 测试用例可以使用以前生成的数据

相关内容

最新更新