Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
    }
}
like image 475
Nate Barbettini Avatar asked Aug 31 '15 21:08

Nate Barbettini


2 Answers

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!

like image 168
Nate Barbettini Avatar answered Sep 24 '22 10:09

Nate Barbettini


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.

like image 8
wintondeshong Avatar answered Sep 21 '22 10:09

wintondeshong