Xunit Следующие параметры конструктора не имеют соответствующих данных о приборах

Я продолжаю получать эту ошибку при использовании xunit для.NET 1.0 framework net46.

The following constructor parameters did not have matching fixture data

Я видел этот пост: приспособление коллекции не вводится и следовал инструкциям относительно приспособления коллекции, как описано здесь:

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

Ничто не похоже на работу.

Любые предложения, что может вызвать это?

9 ответов

В моем случае это оказалось делом правильного выполнения инструкций. По ошибке я пометил класс

 [Collection("ProjectCollection")]

вместо:

 [Collection("ActorProjectCollection")]

Я должен сказать, что механизм внедрения зависимостей XUnit был бы значительно улучшен, если бы сообщения об ошибках давали более явный намек на то, что не так.

Другой сценарий, в котором это может потерпеть неудачу, это если [CollectionDefinition] определяется для типа вне выполняемой тестовой сборки. Сам атрибут должен быть определен внутри него, иначе xUnit не поднимет его.

Это исключение может возникнуть при сбое конструктора вашего класса фикстур из-за какой-то другой проблемы, в моем случае при подключении к локальному серверу Mongo.

Либо найдите другие ошибки и сначала устраните их, либо облегчите конструктор, чтобы он уменьшался.

В моем случае мне пришлось реализовать интерфейс IClassFixture<> в тестовом классе.

public class MyTests : IClassFixture<QueryTestFixture>

После того, как я переместил QueryTestFixture в другой проект, атрибут Class перестал работать.

[Collection("QueryCollection")]

Что было связано с реализацией в классе фикстур (см. Ниже)

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

Я пробовал много альтернативных способов решить эту проблему, но в итоге прочитал объяснение xunit.net об общем контексте.который предоставил решение.

Это случилось со мной пару раз сразу после добавления Collection и CollectionDefinition декораторы и я всегда прихожу к этому ответу при поиске в интернете.

Но в моем случае проблема заключалась лишь в том, что кажется, что перед тем, как проверить, работает ли оно или нет, необходимо действие "Чистое решение". Без очистки раствора я всегда получаю The following constructor parameters did not have matching fixture data ошибка.

Поэтому я также пишу этот ответ, чтобы помочь себе в будущем.


В любом случае, чтобы избежать проблемы, описанной Никола Шоу, вы всегда можете использовать константу, чтобы избежать несоответствия имен:

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

-

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

-

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

Мои два цента: просмотрев опубликованные ответы, я проверил следующее:

  • Классы CollectionDefinition(X) и Collection(X) находятся в одной сборке
  • И определение, и классы, использующие его, относятся к одному и тому же имени коллекции.
  • У классов, использующих определение, есть конструктор, получающий приспособление

Но все равно не работает... В чем была проблема? Класс с определением не имеетpublic модификатор (class Definition ...), в то время как классы, использующие это определение, имеют его.

Просто добавил public к определению, и это сработало как шарм.

Определение в том же пространстве имен

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

использование в том же пространстве имен

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

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

 ...

источник

в моем случае я не делал FixtureClass общедоступным

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

В моем случае у меня был свой Fixtureвнутри CollectionDefinitionвместо FixtureCollection.

Например:

Код приспособления

      public class MyFixture { ... }

Не работает

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

Работающий

      [CollectionDefinition(nameof(MyFixtureCollection))]
public class MyFixtureCollection : ICollection<MyFixture> {}
Другие вопросы по тегам