我正在使用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以提供诸如ints和string之类的参数,这些参数可用于在运行时创建所需的对象。
如果要每个夹具只创建一次这些对象,请使用OneTimeSetUp而不是SetUp并使用参数化的夹具来保存创建它们所需的参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句