Я шукав ту саму відповідь, і на даний момент документація 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 запускає тести при їх паралельному запуску. Для отримання додаткової інформації див. Запуск тестів паралельно.
Важливе зауваження.