Je cherchais la même réponse, et pour le moment, la documentation xUnit est très utile en ce qui concerne la façon d'implémenter les appareils de classe et les appareils de collection qui donnent aux développeurs un large éventail de fonctionnalités de configuration / démontage au niveau de la classe ou du groupe de classes. Ceci est conforme à la réponse de Geir Sagberg, et donne une bonne implémentation squelette pour illustrer à quoi cela devrait ressembler.
https://xunit.github.io/docs/shared-context.html
Fixtures de collection Quand utiliser: lorsque vous voulez créer un contexte de test unique et le partager entre les tests de plusieurs classes de test, et le faire nettoyer une fois tous les tests des classes de test terminés.
Parfois, vous souhaiterez partager un objet fixture entre plusieurs classes de test. L'exemple de base de données utilisé pour les fixtures de classe est un excellent exemple: vous pouvez vouloir initialiser une base de données avec un ensemble de données de test, puis laisser ces données de test en place pour une utilisation par plusieurs classes de test. Vous pouvez utiliser la fonction de fixation de collection de xUnit.net pour partager une seule instance d'objet entre les tests de plusieurs classes de test.
Pour utiliser les appareils de collecte, vous devez suivre les étapes suivantes:
Créez la classe fixture et placez le code de démarrage dans le constructeur de classe fixture. Si la classe fixture doit effectuer un nettoyage, implémentez IDisposable sur la classe fixture et placez le code de nettoyage dans la méthode Dispose (). Créez la classe de définition de collection, en la décorant avec l'attribut [CollectionDefinition], en lui donnant un nom unique qui identifiera la collection de test. Ajoutez ICollectionFixture <> à la classe de définition de collection. Ajoutez l'attribut [Collection] à toutes les classes de test qui feront partie de la collection, en utilisant le nom unique que vous avez fourni à l'attribut [CollectionDefinition] de la classe de définition de la collection de test. Si les classes de test ont besoin d'accéder à l'instance de fixture, ajoutez-la en tant qu'argument de constructeur, et elle sera fournie automatiquement. Voici un exemple simple:
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 traite les fixtures de collection de la même manière que les fixtures de classe, sauf que la durée de vie d'un objet de collection fixture est plus longue: il est créé avant que les tests ne soient exécutés dans l'une des classes de test de la collection, et ne sera pas nettoyé jusqu'à ce que toutes les classes de test de la collection aient fini de s'exécuter.
Les collections de test peuvent également être décorées avec IClassFixture <>. xUnit.net traite cela comme si chaque classe de test individuelle de la collection de tests était décorée avec le luminaire de classe.
Les collections de tests influencent également la manière dont xUnit.net exécute les tests lors de leur exécution en parallèle. Pour plus d'informations, consultez Exécution de tests en parallèle.
Remarque importante: les appareils doivent être dans le même assemblage que le test qui les utilise.