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