20

I keep getting this error while using XUnit for .NET 1.0 framework net46.

The following constructor parameters did not have matching fixture data

I have seen this post: Collection fixture won't inject and followed the instructions regarding collection fixture closely as described here:

http://xunit.github.io/docs/shared-context.html#collection-fixture

Nothing seems to work.

Any suggestions to what might cause this?

Dale K
  • 25,246
  • 15
  • 42
  • 71
Nikola Schou
  • 2,386
  • 3
  • 23
  • 47

9 Answers9

21

In my case it turned out to be a matter of doing it right according to the instructions. By mistake I had annotated the class with

 [Collection("ProjectCollection")]

instead of:

 [Collection("ActorProjectCollection")]

I must say that the dependency injection mechanism of XUnit would be greatly improved if the error messages gave more explicit hint of what is wrong.

Nikola Schou
  • 2,386
  • 3
  • 23
  • 47
14

Another scenario in which this might fail is if the [CollectionDefinition] is defined on a type outside the executing test assembly. The attribute itself needs to be defined inside of it or xUnit won't pick it up.

Jeroen Vannevel
  • 43,651
  • 22
  • 107
  • 170
6

This exception may arise when the constructor of your fixture class is failing due to some other problem, in my case connecting to a local Mongo server.

Either look for other failures and solve those first or lighten your constructor up so it does less.

Luke Puplett
  • 42,091
  • 47
  • 181
  • 266
5

In my case I had to implement the IClassFixture<> interface on the test class.

public class MyTests : IClassFixture<QueryTestFixture>

After I moved the QueryTestFixture to another project the Class attribute stopped working

[Collection("QueryCollection")]

Which was linked to the implementation in the fixture class (see below)

[CollectionDefinition("QueryCollection")]
public class QueryCollection : ICollectionFixture<QueryTestFixture> { }

I had tried many alternative ways to solve this but ended up reading the xunit.net explanation about shared context. which provided a solution.

PunkTurnet
  • 129
  • 2
  • 3
4

It happened to me a couple of times just after adding the Collection and the CollectionDefinition decorators and I always arrive to this answer when looking on Internet.

But in my case the problem was just that it seems that a 'Clean Solution' action is needed before testing whether it works or not. Without cleaning the solution I always get a The following constructor parameters did not have matching fixture data error.

So, I write also this answer in order to help my future self.


Anyway, in order to avoid the problem explained by Nikola Schou, you can always use a constant to avoid name mistmatching:

public static class Collections
{
    public const string ActorProjectCollection= "ActorProjectCollection";
}

-

[Collection(Collections.ActorProjectCollection)]
/// ...

-

[CollectionDefinition(Collections.ActorProjectCollection)]
/// ...
artberri
  • 1,327
  • 13
  • 26
  • 1
    I had the same issue. I couldn't execute multiple tests at once after refactoring my fixtures (they worked if i ran them one by one). After a clean up in VS it worked fine. – Olaj Jul 22 '19 at 09:57
  • Keep in mind that there should only be one class decorated with CollectionDefinition per collection key. – Henryk Budzinski Jan 03 '22 at 20:50
1

definition in the same namespace

  [CollectionDefinition("Integration Tests", DisableParallelization = true)]
    public class TestCollection : ICollectionFixture<WebApplicationFactory<Startup>>
    {
        // This class has no code, and is never created. Its purpose is simply
        // to be the place to apply [CollectionDefinition] and all the
        // ICollectionFixture<> interfaces.
    }

usage in the same namespace

    [Collection("Integration Tests")]
    public class BasicControllerTests
    {
        private readonly WebApplicationFactory<Startup> _factory;

        public BasicControllerTests(WebApplicationFactory<Startup> factory)
        {
            _factory = factory;
        }

 ...

source

Alex
  • 8,908
  • 28
  • 103
  • 157
1

My two cents: looking at the posted responses I checked the following:

  • CollectionDefinition(X) and Collection(X) classes are in the same assembly
  • Both the definition and the classes using it refer to the same collection name
  • The classes using the definition have a constructor receiving the fixture

But still not working... What was the problem? The class with the definition has not the public modifier (class Definition ...) while the classes using the definition have it.

Just added the public to the definition, and it worked like a charm.

RDM
  • 56
  • 8
1

in my case i wasnt make FixtureClass public

   [CollectionDefinition(nameof(ApiTestCollection))]
    **public** class ApiTestCollection : ICollectionFixture<OpenSchoolApiBroker>
    {}

Nour
  • 126
  • 8
0

In my case, I had my Fixture inside of the CollectionDefinition instead of the FixtureCollection.

For example:

Fixture Code

public class MyFixture { ... }

Not Working

[CollectionDefinition(nameof(MyFixture))]
public class MyFixtureCollection : ICollection<MyFixture> {}

Working

[CollectionDefinition(nameof(MyFixtureCollection))]
public class MyFixtureCollection : ICollection<MyFixture> {}
SIRHAMY
  • 157
  • 1
  • 9