玩具示例代码:测试类构造函数在单独运行xUnit理论时不执行?
public abstract class testBase
{
public testBase()
{
//Some common test setup code, which will initialize ManagerClass
}
}
public class someTests: testBase
{
public someTests()
{
//someTests-specific constructor code.
}
[Theory]
[PropertyData("MyTestData")]
public void test1(Foo foo)
{
//Use foo to do a test
}
public static IEnumerable<object[]> MyTestData
{
get
{
yield return new object[] { ManagerClass.CreateANewFoo(1) };
yield return new object[] { ManagerClass.CreateANewFoo(42) };
}
}
}
在上面的例子,如果我专门跑TEST1(我使用ReSharper的,但是当我使用的xUnit GUI也出现问题)我的测试失败,因为它似乎testBase和someTests构造函数都不会被执行。因此,调用ManagerClass.CreateANewFoo()会抛出一个NullReference。
如果我在someTests或任何其他单独测试中运行所有测试,则构造函数按预期执行,并且测试按预期方式进行。将test1标记为不同的唯一事实是它正在使用PropertyData属性。
任何想法为什么发生这种事/我做错了什么?
声明:请勿使用xUnit.net。你有没有尝试把Console.WriteLine/trace语句放在ctors中?你确定ctor没有被调用..因为我没有看到它如何在没有创建测试夹具/类的实例的情况下运行测试。听起来像一个错误,如果运行所有测试/运行一个测试结果在不同的测试输出。尝试:如果ctors被击中,请尝试使用伪值而不是返回静态方法?测试是否在xUnit.net中的不同AppDomain中运行 – Gishu 2009-08-14 05:22:25
将Console.WriteLine语句放在显示测试作为整个类的一部分运行时执行的构造函数。但是单独调试(在Writeline语句中有一个断点),我在调试器中遇到的第一件事是引发NullReference,而不是断点。 – BenA 2009-08-14 08:56:56
这可能是因为您的静态MyTestData方法在测试运行出于某种原因之前被调用 - 因为您不必构造对象来调用静态方法。这个测试夹具设计让我有点不舒服 - 静态方法取决于基类ctor以便正确运行。 PropertyData方法是否可以作为实例方法 - 尝试将基类ctor的设置代码暂时移到静态方法中,以确认是否是原因。 – Gishu 2009-08-14 10:10:11