Aynı cevabı arıyordum ve şu anda xUnit belgeleri, geliştiricilere sınıf veya sınıflar grubu düzeyinde çok çeşitli kurulum / sökme işlevselliği sağlayan Sınıf Fikstürlerinin ve Koleksiyon Fikstürlerinin nasıl uygulanacağı konusunda çok yardımcı oluyor. Bu, Geir Sagberg'in cevabına uygundur ve neye benzemesi gerektiğini göstermek için iyi bir iskelet uygulaması sağlar.
https://xunit.github.io/docs/shared-context.html
Koleksiyon Fikstürleri Ne zaman kullanılmalı: Tek bir test içeriği oluşturmak ve bunu birkaç test sınıfındaki testler arasında paylaşmak ve test sınıflarındaki tüm testler bittikten sonra temizletmek istediğinizde.
Bazen bir fikstür nesnesini birden fazla test sınıfı arasında paylaşmak isteyeceksiniz. Sınıf armatürleri için kullanılan veritabanı örneği harika bir örnektir: bir test verileri kümesiyle bir veritabanını başlatmak ve ardından bu test verilerini birden çok test sınıfı tarafından kullanılmak üzere yerinde bırakmak isteyebilirsiniz. Birkaç test sınıfındaki testler arasında tek bir nesne örneğini paylaşmak için xUnit.net'in toplama fikstürü özelliğini kullanabilirsiniz.
Koleksiyon armatürlerini kullanmak için aşağıdaki adımları uygulamanız gerekir:
Fikstür sınıfını oluşturun ve başlangıç kodunu fikstür sınıfı yapıcısına yerleştirin. Fikstür sınıfının temizleme gerçekleştirmesi gerekiyorsa, fikstür sınıfında IDisposable uygulayın ve temizleme kodunu Dispose () yöntemine yerleştirin. Koleksiyon tanımlama sınıfını oluşturun, [CollectionDefinition] özniteliğiyle süsleyerek, ona test koleksiyonunu tanımlayacak benzersiz bir ad verin. Koleksiyon tanımı sınıfına ICollectionFixture <> ekleyin. Test koleksiyonu tanımlama sınıfının [CollectionDefinition] özelliğine sağladığınız benzersiz adı kullanarak, koleksiyonun parçası olacak tüm test sınıflarına [Collection] özelliğini ekleyin. Test sınıflarının fikstür örneğine erişmesi gerekiyorsa, bunu bir yapıcı argümanı olarak ekleyin ve otomatik olarak sağlanacaktır. İşte basit bir örnek:
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, toplama armatürlerini sınıf armatürleri ile aynı şekilde ele alır, ancak bir koleksiyon fikstürü nesnesinin ömrü daha uzundur: koleksiyondaki herhangi bir test sınıfında herhangi bir test çalıştırılmadan önce oluşturulur ve temizlenmez koleksiyondaki tüm test sınıflarının çalışması bitene kadar.
Test koleksiyonları ayrıca IClassFixture <> ile de dekore edilebilir. xUnit.net bunu, test koleksiyonundaki her bir test sınıfı, sınıf armatürü ile dekore edilmiş gibi ele alır.
Test koleksiyonları, xUnit.net'in paralel olarak çalıştırırken testleri çalıştırma şeklini de etkiler. Daha fazla bilgi için bkz. Testleri Paralel Olarak Çalıştırma.
Önemli not: Fikstürler, onları kullanan test ile aynı montajda olmalıdır.