Сборник не будет вводить
Я использую 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
и теперь все работает