Collection fixture won't inject

2019-04-04 15:31发布

问题:

I'm using xUnit 2.0 collection fixtures to share a common database setup/teardown between a number of different test classes. The fixture also provides some helper properties, so I'm injecting it into each test class.

I recreated the example in the docs, but when I run the test, it fails immediately with:

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

This seems to happen regardless of whether I'm using xUnit Facts or Theories, or which test runner I'm using.


Fixture:

public class IntegrationTestFixture : IDisposable
{
    public IntegrationTestFixture()
    {
        // (setup code)
        this.GeneratedTestName = [randomly generated];
    }

    public void Dispose()
    {
        // (teardown code)
    }

    public string GeneratedTestName { get; private set; }
}

Collection definition:

[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
    // Intentionally left blank.
    // This class only serves as an anchor for CollectionDefinition.
}

Test:

[CollectionDefinition("Live tests")]
public class SomeTests
{
    private readonly IntegrationTestFixture fixture;

    public SomeTests(IntegrationTestFixture fixture)
    {
        this.fixture = fixture;
    }

    [Fact]
    public void MyTestMethod()
    {
        // ... test here
    }
}

回答1:

This was a silly error and it took me a bit to figure out why it wasn't working:

[CollectionDefinition] goes on the collection definition class, but [Collection] goes on the test class. I was on autopilot and didn't notice this.

You'll also get this if you have multiple [CollectionDefinition] attributes with the same name on different classes. Just use one!



回答2:

In my case, the fixture and collection were in a shared testing assembly. I found that XUnit DI could not find it. So, I had to define a fixture that inherited those classes in the shared assembly to both share the functionality while getting it to register in my test classes.



回答3:

In my case, I forgot to inherit from IClassFixture interface...

Wrong...

public class DatabaseIntegrationTests
{

Correct...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{


回答4:

I had the same error, but for me the issue was that I had forgot to make the CollectionDefinition class public e.g.

Wrong

[CollectionDefinition("Live tests")]
class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
    // Intentionally left blank.
    // This class only serves as an anchor for CollectionDefinition.
}

Correct

[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
    // Intentionally left blank.
    // This class only serves as an anchor for CollectionDefinition.
}


回答5:

This can also happen if your Collection's constructor throws an error. You may need to debug that code by alternative means, since the error message provided by xUnit isn't helpful in this case.



回答6:

Many of our TestFixture classes have similar names. So ensure the test fixture type on the definition matches exactly with the type passed into the constructor on the class containing the tests.



回答7:

I've just run into this and I had to put the collection definition into the same namespace as the test class. Not just the same assembly.