Сборник не будет вводить

Я использую XUnit 2,0 коллекции светильников, чтобы разделить общую базу данных установки/демонтажа между множеством различных тестовых классов. Прибор также предоставляет некоторые вспомогательные свойства, поэтому я вставляю их в каждый класс тестов.

Я воссоздал этот пример в документах, но когда я запускаю тест, он немедленно сбой:

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

Это, похоже, происходит независимо от того, использую ли я факты или теории xUnit или какой тестовый бегун я использую.


Крепеж:

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

Ответы

Ответ 1

Это была глупая ошибка, и мне потребовалось немного понять, почему она не работает:

[CollectionDefinition] переходит в класс определения коллекции, но [Collection] переходит в тестовый класс. Я был на автопилоте и не заметил этого.

Вы также получите это, если у вас несколько атрибутов [CollectionDefinition] с тем же именем в разных классах. Просто используйте его!

Ответ 2

В моем случае светильник и коллекция были в общей тестовой сборке. Я обнаружил, что XUnit DI не смог найти его. Таким образом, мне пришлось определить устройство, которое унаследовало эти классы в общей сборке, чтобы совместно использовать эти функции, заставляя их регистрироваться в моих тестовых классах.

Ответ 3

В моем случае я забыл наследовать от интерфейса IClassFixture...

Неправильно...

public class DatabaseIntegrationTests
{

Верный...

public class DatabaseIntegrationTests : IClassFixture<DatabaseFixture>
{

Ответ 4

У меня была такая же ошибка, но для меня проблема заключалась в том, что я забыл сделать класс 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.
}

Ответ 5

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

Ответ 6

Многие из наших классов TestFixture имеют похожие имена. Поэтому убедитесь, что тип тестового прибора в определении точно совпадает с типом, переданным в конструктор класса, содержащего тесты.

Ответ 7

Я просто столкнулся с этим, и мне пришлось поместить определение коллекции в те же пространства имен, что и тестовый класс. Не только одна и та же сборка.

Ответ 8

В моем случае у меня есть две библиотеки классов.

Tests.Infrastructure.csproj

А также

Tests.Web.csproj

Приспособление Database fixture будет вставлено в тесты, которые были сохранены в Tests.Web.csproj. Fixture было реализовано в библиотеке второго класса, Tests.Infrastructore.csproj.

Я перенес реализацию fixture в Tests.Web.csproj, удалил Infrastructure и теперь все работает