XUnit 2.0 コレクションフィクスチャ を使用して、いくつかの異なるテストクラス間で共通のデータベースセットアップ/ティアダウンを共有しています。フィクスチャはいくつかのヘルパープロパティも提供するので、各テストクラスに挿入します。
ドキュメントで例を再作成しましたが、テストを実行するとすぐに失敗します:
次のコンストラクタパラメータには、一致するフィクスチャデータがありませんでした:IntegrationTestFixtureフィクスチャ
これは、xUnitファクトまたは理論を使用しているかどうか、またはどのテストランナーを使用しているかに関係なく発生するようです。
備品:
public class IntegrationTestFixture : IDisposable
{
public IntegrationTestFixture()
{
// (setup code)
this.GeneratedTestName = [randomly generated];
}
public void Dispose()
{
// (teardown code)
}
public string GeneratedTestName { get; private set; }
}
コレクションの定義:
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
テスト:
[CollectionDefinition("Live tests")]
public class SomeTests
{
private readonly IntegrationTestFixture fixture;
public SomeTests(IntegrationTestFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyTestMethod()
{
// ... test here
}
}
これはばかげたエラーであり、なぜ機能しないのかを理解するのに少し時間がかかりました。
[CollectionDefinition]
はコレクション定義クラスになりますが、[Collection]
はテストクラスになります。私はオートパイロットをしていて、これに気づきませんでした。
異なるクラスに同じ名前のmultiple[CollectionDefinition]
属性がある場合も、これを取得します。 1つだけ使用してください!
私の場合、フィクスチャとコレクションは共有テストアセンブリにありました。 XUnit DIがそれを見つけられないことがわかりました。したがって、共有アセンブリでこれらのクラスを継承するフィクスチャを定義して、テストクラスに登録すると同時に機能を共有する必要がありました。
これは、コレクションのコンストラクターがエラーをスローした場合にも発生する可能性があります。この場合、xUnitによって提供されるエラーメッセージは役に立たないため、別の方法でそのコードをデバッグする必要がある場合があります。
私の場合、IClassFixture
インターフェースから継承するのを忘れていました...
違う...
public class DatabaseIntegrationTests
{
正しい...
public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{
同じエラーが発生しましたが、私にとっての問題は、CollectionDefinition
クラスpublic
を作成するのを忘れていたということでした。
違う
[CollectionDefinition("Live tests")]
class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
正しい
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
TestFixtureクラスの多くは同様の名前を持っています。したがって、定義のテストフィクスチャタイプが、テストを含むクラスのコンストラクターに渡されたタイプと正確に一致することを確認してください。
私はこれに遭遇したばかりで、コレクション定義をテストクラスと同じ名前空間に配置する必要がありました。同じアセンブリだけではありません。
私の場合、2つのクラスライブラリがあります。
Tests.Infrastructure.csproj
そして
Tests.Web.csproj
Database fixture
は、Tests.Web.csproj
に保存されているテストに挿入されません。 Fixture
は2番目のクラスライブラリTests.Infrastructore.csproj
に実装されました。
fixture
の実装をTests.Web.csproj
に移動し、Infrastructure
を削除して、すべての機能が動作するようになりました