Ich habe nach der gleichen Antwort gesucht, und zu diesem Zeitpunkt ist die xUnit-Dokumentation sehr hilfreich bei der Implementierung von Klassen- und Sammlungsvorrichtungen, die Entwicklern eine breite Palette von Einrichtungs- / Abbaufunktionen auf Klassen- oder Klassengruppenebene bieten. Dies steht im Einklang mit der Antwort von Geir Sagberg und bietet eine gute Skelettimplementierung, um zu veranschaulichen, wie es aussehen sollte.
https://xunit.github.io/docs/shared-context.html
Sammlungsvorrichtungen Verwendungszweck: Wenn Sie einen einzelnen Testkontext erstellen und ihn für Tests in mehreren Testklassen freigeben und nach Abschluss aller Tests in den Testklassen bereinigen möchten.
Manchmal möchten Sie ein Fixture-Objekt für mehrere Testklassen freigeben. Das für Klassenvorrichtungen verwendete Datenbankbeispiel ist ein gutes Beispiel: Möglicherweise möchten Sie eine Datenbank mit einer Reihe von Testdaten initialisieren und diese Testdaten dann für die Verwendung durch mehrere Testklassen beibehalten. Sie können die Collection Fixture-Funktion von xUnit.net verwenden, um eine einzelne Objektinstanz für Tests in mehreren Testklassen freizugeben.
Um Sammlungsvorrichtungen zu verwenden, müssen Sie die folgenden Schritte ausführen:
Erstellen Sie die Fixture-Klasse und fügen Sie den Startcode in den Fixture-Klassenkonstruktor ein. Wenn die Fixture-Klasse eine Bereinigung durchführen muss, implementieren Sie IDisposable für die Fixture-Klasse und fügen Sie den Bereinigungscode in die Dispose () -Methode ein. Erstellen Sie die Sammlungsdefinitionsklasse, indem Sie sie mit dem Attribut [CollectionDefinition] dekorieren und ihr einen eindeutigen Namen geben, der die Testsammlung identifiziert. Fügen Sie der Sammlungsdefinitionsklasse ICollectionFixture <> hinzu. Fügen Sie das Attribut [Sammlung] allen Testklassen hinzu, die Teil der Sammlung sein werden, und verwenden Sie dabei den eindeutigen Namen, den Sie für das Attribut [SammlungDefinition] der Definitionsklasse der Testsammlung angegeben haben. Wenn die Testklassen Zugriff auf die Fixture-Instanz benötigen, fügen Sie sie als Konstruktorargument hinzu, und sie wird automatisch bereitgestellt. Hier ist ein einfaches Beispiel:
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 behandelt Sammlungsvorrichtungen ähnlich wie Klassenvorrichtungen, mit der Ausnahme, dass die Lebensdauer eines Sammlungsvorrichtungsobjekts länger ist: Es wird erstellt, bevor Tests in einer der Testklassen in der Sammlung ausgeführt werden, und wird nicht bereinigt bis alle Testklassen in der Sammlung beendet sind.
Testsammlungen können auch mit IClassFixture <> dekoriert werden. xUnit.net behandelt dies so, als ob jede einzelne Testklasse in der Testsammlung mit dem Klassengerät dekoriert wäre.
Testsammlungen beeinflussen auch die Art und Weise, wie xUnit.net Tests ausführt, wenn sie parallel ausgeführt werden. Weitere Informationen finden Sie unter Paralleles Ausführen von Tests.
Wichtiger Hinweis: Die Geräte müssen sich in derselben Baugruppe befinden wie der Test, in dem sie verwendet werden.