Приспособление коллекции не будет вводить
Я использую приспособления коллекции xUnit 2.0, чтобы разделить общую настройку / разбор базы данных между несколькими различными классами тестов. Устройство также предоставляет некоторые вспомогательные свойства, поэтому я внедряю его в каждый тестовый класс.
Я воссоздал пример в документации, но когда я запускаю тест, он сразу завершается неудачно с:
Следующие параметры конструктора не имеют соответствующих данных фикстуры: IntegrationTestFixture fixture
Кажется, это происходит независимо от того, использую ли я xUnit Facts или Theories, или какой тестовый прогон я использую.
Крепеж:
public class IntegrationTestFixture : IDisposable
{
public IntegrationTestFixture()
{
// (setup code)
this.GeneratedTestName = [randomly generated];
}
public void Dispose()
{
// (teardown code)
}
public string GeneratedTestName { get; private set; }
}
Определение коллекции:
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
Тестовое задание:
[CollectionDefinition("Live tests")]
public class SomeTests
{
private readonly IntegrationTestFixture fixture;
public SomeTests(IntegrationTestFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyTestMethod()
{
// ... test here
}
}
9 ответов
Это была глупая ошибка, и мне понадобилось немного времени, чтобы понять, почему она не работает:
[CollectionDefinition]
идет в классе определения коллекции, но [Collection]
идет на тестовый класс. Я был на автопилоте и не заметил этого.
Вы также получите это, если у вас есть несколько [CollectionDefinition]
атрибуты с одинаковыми именами в разных классах. Просто используйте один!
В моем случае прибор и коллекция находились в общей сборке для тестирования. Я обнаружил, что XUnit D я не мог найти его. Итак, мне нужно было определить осветитель, который унаследовал эти классы в общей сборке, чтобы они оба совместно использовали функциональные возможности, в то же время заставляя его регистрироваться в моих тестовых классах.
Это также может произойти, если конструктор вашей Коллекции выдает ошибку. Вам может понадобиться отладить этот код альтернативными способами, поскольку сообщение об ошибке, предоставляемое xUnit, в этом случае не поможет.
У меня была та же ошибка, но для меня проблема заключалась в том, что я забыл сделать CollectionDefinition
учебный класс public
например
Неправильно
[CollectionDefinition("Live tests")]
class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
Правильный
[CollectionDefinition("Live tests")]
public class IntegrationTestCollection : ICollectionFixture<IntegrationTestFixture>
{
// Intentionally left blank.
// This class only serves as an anchor for CollectionDefinition.
}
В моем случае я забыл унаследовать от IClassFixture
интерфейс...
Неправильно...
public class DatabaseIntegrationTests
{
Правильный...
public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{
Я только что столкнулся с этим, и мне пришлось поместить определение коллекции в то же пространство имен, что и тестовый класс. Не просто такая же сборка.
Многие из наших классов TestFixture имеют похожие имена. Поэтому убедитесь, что тип тестового набора в определении точно совпадает с типом, переданным в конструктор класса, содержащего тесты.
В моем случае у меня есть две библиотеки классов.
Tests.Infrastructure.csproj
А также
Tests.Web.csproj
Database fixture
не будет использоваться в тестах, которые хранились в Tests.Web.csproj
. Fixture
реализована в библиотеке второго класса, Tests.Infrastructore.csproj
.
Я переместил реализацию fixture
к Tests.Web.csproj
, удалено Infrastructure
и все работает сейчас
Если у вас несколько тестовых проектов, каждый проект должен иметь свой собственный файл .
Вы не можете использовать общий
Fixture
или же
Collection
между проектами.
Чтобы было ясно, я считаю ошибкой то, что мы ищем определения коллекций только в тестовой сборке, а не во всех сборках.
Это не означает, что мы будем поддерживать экземпляры фикстур одной коллекции в тестовых сборках. Каждая тестовая сборка рун изолирована в собственном App Domain. Вы по-прежнему можете получить новый экземпляр фикстуры коллекции для каждого домена приложения.