web-dev-qa-db-ja.com

コレクションフィクスチャは注入されません

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
    }
}
18
Nate Barbettini

これはばかげたエラーであり、なぜ機能しないのかを理解するのに少し時間がかかりました。

[CollectionDefinition]はコレクション定義クラスになりますが、[Collection]はテストクラスになります。私はオートパイロットをしていて、これに気づきませんでした。

異なるクラスに同じ名前のmultiple[CollectionDefinition]属性がある場合も、これを取得します。 1つだけ使用してください!

17
Nate Barbettini

私の場合、フィクスチャとコレクションは共有テストアセンブリにありました。 XUnit DIがそれを見つけられないことがわかりました。したがって、共有アセンブリでこれらのクラスを継承するフィクスチャを定義して、テストクラスに登録すると同時に機能を共有する必要がありました。

7
wintondeshong

これは、コレクションのコンストラクターがエラーをスローした場合にも発生する可能性があります。この場合、xUnitによって提供されるエラーメッセージは役に立たないため、別の方法でそのコードをデバッグする必要がある場合があります。

7
Isaac Lyman

私の場合、IClassFixtureインターフェースから継承するのを忘れていました...

違う...

public class DatabaseIntegrationTests
{

正しい...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{
3
Rosdi Kasim

同じエラーが発生しましたが、私にとっての問題は、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.
}
3
matthewrwilton

TestFixtureクラスの多くは同様の名前を持っています。したがって、定義のテストフィクスチャタイプが、テストを含むクラスのコンストラクターに渡されたタイプと正確に一致することを確認してください。

1

私はこれに遭遇したばかりで、コレクション定義をテストクラスと同じ名前空間に配置する必要がありました。同じアセンブリだけではありません。

0
Tom Makin

私の場合、2つのクラスライブラリがあります。

Tests.Infrastructure.csproj

そして

Tests.Web.csproj

Database fixtureは、Tests.Web.csprojに保存されているテストに挿入されません。 Fixtureは2番目のクラスライブラリTests.Infrastructore.csprojに実装されました。

fixtureの実装をTests.Web.csprojに移動し、Infrastructureを削除して、すべての機能が動作するようになりました

0
michasaucer