Я искал тот же ответ, и в настоящее время документация xUnit очень полезна в отношении того, как реализовать фикстуры классов и фикстуры коллекций, которые предоставляют разработчикам широкий спектр функциональных возможностей установки / разрыва на уровне класса или группы классов. Это соответствует ответу Гейра Сагберга и дает хорошую реализацию скелета, чтобы проиллюстрировать, как он должен выглядеть.
https://xunit.github.io/docs/shared-context.html
Приспособления для сбора данных Когда использовать: когда вы хотите создать единый тестовый контекст и поделиться им между тестами в нескольких тестовых классах, а также очистить его после завершения всех тестов в тестовых классах.
Иногда вам может понадобиться разделить объект фикстуры между несколькими тестовыми классами. Пример базы данных, используемый для фикстур классов, является отличным примером: вы можете инициализировать базу данных набором тестовых данных, а затем оставить эти тестовые данные на месте для использования несколькими тестовыми классами. Вы можете использовать функцию сбора данных в xUnit.net, чтобы совместно использовать один экземпляр объекта среди тестов в нескольких тестовых классах.
Чтобы использовать приспособления для сбора, необходимо выполнить следующие действия:
Создайте класс фикстуры и поместите код запуска в конструктор класса фикстуры. Если классу фикстуры необходимо выполнить очистку, реализуйте IDisposable в классе фикстуры и поместите код очистки в метод Dispose (). Создайте класс определения коллекции, украсив его атрибутом [CollectionDefinition], присвоив ему уникальное имя, которое будет идентифицировать тестовую коллекцию. Добавьте ICollectionFixture <> в класс определения коллекции. Добавьте атрибут [Collection] ко всем тестовым классам, которые будут частью коллекции, используя уникальное имя, которое вы предоставили атрибуту [CollectionDefinition] класса определения тестовой коллекции. Если тестовым классам нужен доступ к экземпляру фикстуры, добавьте его в качестве аргумента конструктора, и он будет предоставлен автоматически. Вот простой пример:
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// ... initialize data in the test database ...
}
public void Dispose()
{
// ... clean up test data from the database ...
}
public SqlConnection Db { get; private set; }
}
[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
// 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("Database collection")]
public class DatabaseTestClass1
{
DatabaseFixture fixture;
public DatabaseTestClass1(DatabaseFixture fixture)
{
this.fixture = fixture;
}
}
[Collection("Database collection")]
public class DatabaseTestClass2
{
// ...
}
xUnit.net обрабатывает фикстуры коллекции во многом так же, как фикстуры классов, за исключением того, что время жизни объекта фикстуры коллекции больше: он создается перед запуском любых тестов в любом из тестовых классов в коллекции и не будет очищен до тех пор, пока все тестовые классы в коллекции не закончат работу.
Коллекции тестов также можно украсить с помощью IClassFixture <>. xUnit.net рассматривает это так, как если бы каждый отдельный тестовый класс в тестовой коллекции был украшен фикстурой класса.
Коллекции тестов также влияют на то, как xUnit.net запускает тесты при их параллельном запуске. Для получения дополнительной информации см. Параллельное выполнение тестов.
Важное примечание: приспособления должны быть в той же сборке, что и тест, в котором они используются.