2009-08-12 10 views
0

玩具のコード例:上記の例でxUnit Theoryを個別に実行しているときに、テストクラスのコンストラクタは実行されませんか?

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) }; 
    } 
    } 
} 

、それがいるようですので、私は特に(私はReSharperのを使用していますが、私はxUnitのGUIを使用する場合に問題が発生した)私のテストが失敗しているTEST1を実行する場合testBaseコンストラクタもsomeTestsコンストラクタも実行されていません。したがって、ManagerClass.CreateANewFoo()を呼び出すとNullReferenceがスローされます。

someTestsや他の個別のテストですべてのテストを実行すると、コンストラクタは期待どおりに実行され、テストは期待どおりに進められます。 test1を異なるものとしてマークする唯一のものは、PropertyData属性を使用しているという事実です。

これがどうして起こっているのか、私が間違っていることは何ですか?

+0

免責事項:xUnit.netを使用しないでください。 Console.WriteLine/traceステートメントをctorsに入れてみましたか? ctorが呼び出されていないことを確信していますか?テストフィクスチャ/クラスのインスタンスを作成せずにテストを実行する方法はわかりません。すべてのテストを実行する/ 1つのテストを実行すると異なるテスト結果が返ってくると、バグのように聞こえます。試してください:ctorsがヒットしている場合は、静的メソッドの戻り値の代わりに偽の値を使用してみてください。 xUnit.netの異なるAppDomainsでテストを実行します – Gishu

+0

Console.WriteLineステートメントを配置すると、テストがクラス全体の一部として実行されるときに実行されるコンストラクタが表示されます。しかし、個別に(Writelineステートメントでブレークポイントを使用して)デバッグすると、ブレークポイントではなくNullReferenceがスローされます。 – BenA

+0

静的メソッドを呼び出すためにオブジェクトを構築する必要がないため、テストが何らかの理由で実行される前に、静的なMyTestDataメソッドが呼び出されている可能性があります。このテストフィクスチャデザインは私には少し不快です。静的メソッドは、正常に動作するために基本クラスのctorに依存しています。 PropertyDataメソッドがインスタンスメソッドである可能性があります。セットアップコードを基本クラスctorから静的メソッドに一時的に移動して、それが原因であるかどうかを確認してください。 – Gishu

答えて

1

これをxUnit.net 1.5 Betaで再現しようとしましたができません。

+0

CodePlex(http://xunit.codeplex.com/Thread/View.aspx?ThreadId=65564)についてさらに説明した後、実行順序を考慮してテストをリファクタリングする必要があります。 – BenA