收藏夹具不会注入

时间:2015-08-31 21:01:17

标签: xunit.net xunit2

我正在使用xUnit 2.0 collection fixtures来共享许多不同测试类之间的公共数据库设置/拆除。 fixture还提供了一些辅助属性,所以我将它注入每个测试类。

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

  

以下构造函数参数没有匹配的fixture数据:IntegrationTestFixture fixture

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

夹具:

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

8 个答案:

答案 0 :(得分:12)

这是一个愚蠢的错误,我花了一点时间弄清楚它为什么不起作用:

[CollectionDefinition]继续集合定义类,但[Collection]继续测试类。我在自动驾驶仪上并没有注意到这一点。

如果您在不同的课程中具有相同名称的多个 [CollectionDefinition]属性,您也会得到此信息。只需使用一个!

答案 1 :(得分:6)

在我的情况下,夹具和集合在共享测试组件中。我发现XUnit DI找不到它。所以,我必须定义一个在共享程序集中继承这些类的fixture,以便在让它在我的测试类中注册时共享功能。

答案 2 :(得分:4)

就我而言,我忘了继承IClassFixture界面......

...误

public class DatabaseIntegrationTests
{

正确...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{

答案 3 :(得分:3)

我有同样的错误,但对我来说,问题是我忘记了CollectionDefinitionpublic,例如。

错误

[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.
}

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我刚刚遇到了这个问题,我不得不将集合定义放入与测试类相同的名称空间中。不只是相同的程序集。

答案 7 :(得分:0)

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

Tests.Infrastructure.csproj

Tests.Web.csproj

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

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