Szukałem tej samej odpowiedzi i w tej chwili dokumentacja xUnit jest bardzo pomocna w odniesieniu do tego, jak zaimplementować urządzenia klasowe i kolekcje, które zapewniają programistom szeroki zakres funkcji konfiguracji / rozłączania na poziomie klasy lub grupy klas. Jest to zgodne z odpowiedzią Geira Sagberga i zapewnia dobrą implementację szkieletu, aby zilustrować, jak powinien wyglądać.
https://xunit.github.io/docs/shared-context.html
Collection Fixtures Kiedy używać: gdy chcesz utworzyć pojedynczy kontekst testowy i udostępnić go między testami w kilku klasach testowych oraz wyczyścić go po zakończeniu wszystkich testów w klasach testowych.
Czasami będziesz chciał udostępnić obiekt urządzenia wielu klasom testowym. Przykład bazy danych używany dla urządzeń klasowych jest świetnym przykładem: możesz chcieć zainicjować bazę danych z zestawem danych testowych, a następnie pozostawić te dane testowe na miejscu do użytku przez wiele klas testowych. Możesz użyć funkcji gromadzenia urządzeń xUnit.net, aby udostępnić jedną instancję obiektu testom w kilku klasach testowych.
Aby użyć osprzętu do kolekcjonowania, musisz wykonać następujące czynności:
Utwórz klasę fixture i umieść kod startowy w konstruktorze klasy fixture. Jeśli klasa fixture wymaga czyszczenia, zaimplementuj IDisposable w klasie fixture i umieść kod cleanup w metodzie Dispose (). Utwórz klasę definicji kolekcji, dekorując ją atrybutem [CollectionDefinition], nadając jej unikalną nazwę, która będzie identyfikować kolekcję testową. Dodaj ICollectionFixture <> do klasy definicji kolekcji. Dodaj atrybut [Collection] do wszystkich klas testowych, które będą częścią kolekcji, używając unikatowej nazwy podanej w atrybucie [CollectionDefinition] klasy definicji kolekcji testów. Jeśli klasy testowe potrzebują dostępu do instancji fixture, dodaj ją jako argument konstruktora, a zostanie ona dostarczona automatycznie. Oto prosty przykład:
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
}
public void Dispose()
{
}
public SqlConnection Db { get; private set; }
}
[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
}
[Collection("Database collection")]
public class DatabaseTestClass1
{
DatabaseFixture fixture;
public DatabaseTestClass1(DatabaseFixture fixture)
{
this.fixture = fixture;
}
}
[Collection("Database collection")]
public class DatabaseTestClass2
{
}
xUnit.net traktuje urządzenia kolekcji w taki sam sposób, jak urządzenia klas, z tym wyjątkiem, że czas życia obiektu ustalania kolekcji jest dłuższy: jest tworzony przed uruchomieniem jakichkolwiek testów w którejkolwiek z klas testowych w kolekcji i nie zostanie wyczyszczony aż do zakończenia działania wszystkich klas testowych w kolekcji.
Kolekcje testowe można również ozdobić za pomocą IClassFixture <>. xUnit.net traktuje to tak, jakby każda pojedyncza klasa testowa w kolekcji testów była ozdobiona urządzeniem klasy.
Kolekcje testów wpływają również na sposób, w jaki xUnit.net uruchamia testy podczas równoległego ich uruchamiania. Aby uzyskać więcej informacji, zobacz równoległe uruchamianie testów.
Ważna uwaga: Oprawy muszą być w tym samym zespole, co test, który ich używa.