Saya mencari jawaban yang sama, dan saat ini dokumentasi xUnit sangat membantu dalam hal cara mengimplementasikan Perlengkapan Kelas dan Perlengkapan Koleksi yang memberi pengembang berbagai fungsi penyiapan / pembongkaran di kelas atau kelompok tingkat kelas. Hal ini sejalan dengan jawaban dari Geir Sagberg, dan memberikan implementasi kerangka yang baik untuk menggambarkan seperti apa bentuknya.
https://xunit.github.io/docs/shared-context.html
Perlengkapan Koleksi Kapan digunakan: saat Anda ingin membuat konteks pengujian tunggal dan membagikannya di antara pengujian di beberapa kelas pengujian, dan membersihkannya setelah semua pengujian di kelas pengujian selesai.
Terkadang Anda ingin berbagi objek perlengkapan di antara beberapa kelas pengujian. Contoh database yang digunakan untuk perlengkapan kelas adalah contoh yang bagus: Anda mungkin ingin menginisialisasi database dengan sekumpulan data pengujian, dan kemudian membiarkan data pengujian tersebut untuk digunakan oleh beberapa kelas pengujian. Anda dapat menggunakan fitur perlengkapan koleksi xUnit.net untuk berbagi contoh objek tunggal di antara pengujian di beberapa kelas pengujian.
Untuk menggunakan perlengkapan koleksi, Anda perlu mengambil langkah-langkah berikut:
Buat kelas perlengkapan, dan letakkan kode startup di konstruktor kelas perlengkapan. Jika kelas perlengkapan perlu melakukan pembersihan, implementasikan IDisposable pada kelas perlengkapan, dan letakkan kode pembersihan di metode Dispose (). Buat kelas definisi koleksi, hiasi dengan atribut [CollectionDefinition], beri nama unik yang akan mengidentifikasi koleksi pengujian. Tambahkan ICollectionFixture <> ke kelas definisi koleksi. Tambahkan atribut [Collection] ke semua kelas pengujian yang akan menjadi bagian dari koleksi, menggunakan nama unik yang Anda berikan ke atribut [CollectionDefinition] kelas definisi koleksi pengujian. Jika kelas pengujian memerlukan akses ke instance fixture, tambahkan sebagai argumen konstruktor, dan itu akan disediakan secara otomatis. Berikut ini contoh sederhananya:
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 memperlakukan perlengkapan koleksi dengan cara yang hampir sama seperti perlengkapan kelas, kecuali bahwa umur objek perlengkapan koleksi lebih lama: itu dibuat sebelum tes apa pun dijalankan di kelas tes mana pun dalam koleksi, dan tidak akan dibersihkan hingga semua kelas pengujian dalam koleksi selesai dijalankan.
Koleksi tes juga dapat didekorasi dengan IClassFixture <>. xUnit.net memperlakukan ini seolah-olah setiap kelas tes individu dalam koleksi tes didekorasi dengan perlengkapan kelas.
Koleksi pengujian juga memengaruhi cara xUnit.net menjalankan pengujian saat menjalankannya secara paralel. Untuk informasi lebih lanjut, lihat Menjalankan Tes secara Paralel.
Catatan penting: Perlengkapan harus di rakitan yang sama dengan tes yang menggunakannya.