Eu estava procurando a mesma resposta e, neste momento, a documentação do xUnit é muito útil no que diz respeito a como implementar Fixtures de classe e Fixtures de coleção que fornecem aos desenvolvedores uma ampla gama de funcionalidade de configuração / desmontagem no nível de classe ou grupo de classes. Isso está de acordo com a resposta de Geir Sagberg e fornece uma boa implementação do esqueleto para ilustrar como deve ser.
https://xunit.github.io/docs/shared-context.html
Fixtures da coleção Quando usar: quando você deseja criar um único contexto de teste e compartilhá-lo entre os testes em várias classes de teste, e limpá-lo depois que todos os testes nas classes de teste terminarem.
Às vezes, você desejará compartilhar um objeto de fixação entre várias classes de teste. O exemplo de banco de dados usado para fixtures de classe é um ótimo exemplo: você pode querer inicializar um banco de dados com um conjunto de dados de teste e, em seguida, deixar esses dados de teste no local para uso por várias classes de teste. Você pode usar o recurso de fixação de coleção de xUnit.net para compartilhar uma única instância de objeto entre os testes em várias classes de teste.
Para usar acessórios de coleta, você precisa seguir as seguintes etapas:
Crie a classe de fixture e coloque o código de inicialização no construtor da classe de fixture. Se a classe fixture precisar realizar uma limpeza, implemente IDisposable na classe fixture e coloque o código de limpeza no método Dispose (). Crie a classe de definição de coleção, decorando-a com o atributo [CollectionDefinition], dando a ela um nome exclusivo que identificará a coleção de teste. Adicione ICollectionFixture <> à classe de definição da coleção. Adicione o atributo [Collection] a todas as classes de teste que farão parte da coleção, usando o nome exclusivo que você forneceu ao atributo [CollectionDefinition] da classe de definição da coleção de teste. Se as classes de teste precisam acessar a instância do fixture, adicione-o como um argumento do construtor, e ele será fornecido automaticamente. Aqui está um exemplo simples:
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 trata os acessórios de coleção da mesma maneira que os acessórios de classe, exceto que o tempo de vida de um objeto de acessório de coleção é mais longo: ele é criado antes que qualquer teste seja executado em qualquer uma das classes de teste na coleção e não será limpo até que todas as classes de teste na coleção tenham concluído a execução.
As coleções de teste também podem ser decoradas com IClassFixture <>. xUnit.net trata isso como se cada classe de teste individual na coleção de teste fosse decorada com o acessório da classe.
As coleções de teste também influenciam a maneira como o xUnit.net executa os testes ao executá-los em paralelo. Para obter mais informações, consulte Executando testes em paralelo.
Nota importante: Os acessórios devem estar na mesma montagem que o teste que os utiliza.