Nate Barbettini
Nate Barbettini

Reputation: 53600

Collection fixture won't inject

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

Upvotes: 21

Views: 17693

Answers (9)

Farhad Zamani
Farhad Zamani

Reputation: 5861

According to this issue:

If you have multiple test projects, each project should have its own Fixture and Collection.

You can't use a shared Fixture or Collection between projects.

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

Upvotes: 0

michasaucer
michasaucer

Reputation: 5228

In my case, i have two class library.

Tests.Infrastructure.csproj

And

Tests.Web.csproj

Database fixture wont injcet into tests that was stored in Tests.Web.csproj. Fixture was implemented in second class library, Tests.Infrastructore.csproj.

I moved implementation of fixture to Tests.Web.csproj, deleted Infrastructure and all works now

Upvotes: 0

Tom Makin
Tom Makin

Reputation: 3303

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.

Upvotes: 1

Isaac Lyman
Isaac Lyman

Reputation: 2205

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.

Upvotes: 8

Aaron L. Johnson
Aaron L. Johnson

Reputation: 191

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.

Upvotes: 1

wintondeshong
wintondeshong

Reputation: 1277

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.

Upvotes: 10

matthewrwilton
matthewrwilton

Reputation: 133

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

Upvotes: 7

Rosdi Kasim
Rosdi Kasim

Reputation: 25956

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

Wrong...

public class DatabaseIntegrationTests
{

Correct...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{

Upvotes: 5

Nate Barbettini
Nate Barbettini

Reputation: 53600

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!

Upvotes: 28

Related Questions