Приспособление коллекции не будет вводить

Я использую приспособления коллекции 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. Вы по-прежнему можете получить новый экземпляр фикстуры коллекции для каждого домена приложения.

Другие вопросы по тегам