AutoFixture 3.50とxUnit.NETを使用すると、Fixture.Create()
が具体的なオブジェクトを作成する方法とAutoData Theoryテストが具体的なオブジェクトを作成する方法に違いがあるようです。AutoDataAttributeの具体的なオブジェクト作成ロジックは、一度すべてのプロパティゲッターを呼び出します
簡単な例:Fixture
を用い
public class Foo
{
private string prop;
public string Prop
{
get
{
if (prop == null) { prop = "Prop"; } // Breakpoint 'A'
return prop;
}
}
}
をテスト:
[Fact]
public void FixtureTest()
{
var fixture = new Fixture();
var result = fixture.Create<Foo>(); // Breakpoint 'B1'
}
AutoDataAttribute
を用いた試験:
[Theory, AutoData]
public void AutoDataTest(Foo sut)
{
var bar = 1; // Essential no-op, Breakpoint 'B2'
}
前のテストでは、ブレークポイント 'B1'がヒットし、ブレークポイント 'A'は決してヒットしませんでした。後者のテストでは、ブレークポイント 'B2'がヒットする前にブレークポイント 'A'がヒットします。テストが実行される前にプロパティのバッキングフィールドが初期化されているため、初期化ロジックをテストできないため、これは上記のものと似ているわけではありません。
AutoDataAttribute
をカスタマイズしてこの問題を回避する方法はありますか?あるいはおそらく、これはバグでしょうか?
詳細な回答ありがとうございます! – MrPiao