2009-08-12 87 views
0

玩具示例代码:测试类构造函数在单独运行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属性。

任何想法为什么发生这种事/我做错了什么?

+0

声明:请勿使用xUnit.net。你有没有尝试把Console.WriteLine/trace语句放在ctors中?你确定ctor没有被调用..因为我没有看到它如何在没有创建测试夹具/类的实例的情况下运行测试。听起来像一个错误,如果运行所有测试/运行一个测试结果在不同的测试输出。尝试:如果ctors被击中,请尝试使用伪值而不是返回静态方法?测试是否在xUnit.net中的不同AppDomain中运行 – Gishu 2009-08-14 05:22:25

+0

将Console.WriteLine语句放在显示测试作为整个类的一部分运行时执行的构造函数。但是单独调试(在Writeline语句中有一个断点),我在调试器中遇到的第一件事是引发NullReference,而不是断点。 – BenA 2009-08-14 08:56:56

+0

这可能是因为您的静态MyTestData方法在测试运行出于某种原因之前被调用 - 因为您不必构造对象来调用静态方法。这个测试夹具设计让我有点不舒服 - 静态方法取决于基类ctor以便正确运行。 PropertyData方法是否可以作为实例方法 - 尝试将基类ctor的设置代码暂时移到静态方法中,以确认是否是原因。 – Gishu 2009-08-14 10:10:11

回答

1

我们试图用xUnit.net 1.5 Beta来重现这一点,但不能。

+0

经过对CodePlex的进一步讨论(http://xunit.codeplex.com/Thread/View.aspx?ThreadId=65564)之后,我只需要根据执行顺序重构测试。 – BenA 2009-08-17 08:19:14

相关问题