收集夹具不会注入

Collection fixture won't inject

我正在使用 xUnit 2.0 collection fixtures 在多个不同的测试 class 之间共享一个公共数据库 setup/teardown。 fixture 还提供了一些辅助属性,所以我将它注入到每个测试中 class.

我在文档中重新创建了示例,但是当我 运行 测试时,它立即失败并显示:

The following constructor parameters did not have matching fixture data: IntegrationTestFixture fixture

无论我使用的是 xUnit Facts 还是 Theories,或者我使用的是哪种测试 运行ner,这似乎都会发生。


夹具:

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] 继续集合定义 class,但 [Collection] 继续测试 class。我当时处于自动驾驶状态,没有注意到这一点。

如果您在不同的 class 上有 多个 [CollectionDefinition] 具有相同名称的属性,您也会得到这个。就用一个吧!

在我的例子中,我忘记继承自 IClassFixture 接口...

错误...

public class DatabaseIntegrationTests
{

正确...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{

我有同样的错误,但对我来说问题是我忘记制作 CollectionDefinition class 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.
}

在我的例子中,夹具和集合在一个共享的测试程序集中。我发现XUnit DI找不到它。因此,我必须定义一个夹具,它继承了共享程序集中的那些 类 以共享功能,同时让它在我的测试 类.

中注册

我们的许多 TestFixture classes 具有相似的名称。因此,确保定义中的测试夹具类型与传递到包含测试的 class 上的构造函数的类型完全匹配。

如果您的 Collection 的构造函数抛出错误,也会发生这种情况。您可能需要通过其他方式调试该代码,因为 xUnit 提供的错误消息在这种情况下没有帮助。

我刚刚 运行 进入这个,我不得不将集合定义放入与测试相同的命名空间 class。不只是同一个程序集。

就我而言,我有两个 class 库。

Tests.Infrastructure.csproj

Tests.Web.csproj

Database fixture 不会注入存储在 Tests.Web.csproj 中的测试。 Fixture 在第二个 class 库中实现,Tests.Infrastructore.csproj

我将 fixture 的实现移到了 ​​Tests.Web.csproj,删除了 Infrastructure,现在一切正常

根据this issue:

如果您有多个测试项目,每个项目都应该有自己的 FixtureCollection

您不能在项目之间使用共享 FixtureCollection

To be clear, what I believe to be the bug is that we only search for collection definitions in the test assembly, not in all the assemblies.

This does not mean that we would support a single collection fixture instances across test assemblies. Each test assembly runes isolated in its own App Domain. You could still get a new instance of the collection fixture per App Domain