Tôi đang tìm kiếm câu trả lời tương tự và tại thời điểm này, tài liệu xUnit rất hữu ích về cách triển khai Đồ đạc lớp và Đồ đạc bộ sưu tập cung cấp cho các nhà phát triển nhiều chức năng thiết lập / chia nhỏ ở cấp độ lớp hoặc nhóm lớp. Điều này phù hợp với câu trả lời từ Geir Sagberg và cung cấp cách triển khai khung xương tốt để minh họa nó trông như thế nào.
https://xunit.github.io/docs/shared-context.html
Bộ sưu tập Khi nào sử dụng: khi bạn muốn tạo một ngữ cảnh thử nghiệm duy nhất và chia sẻ nó giữa các thử nghiệm trong một số lớp thử nghiệm và dọn dẹp nó sau khi tất cả các thử nghiệm trong các lớp thử nghiệm đã kết thúc.
Đôi khi bạn sẽ muốn chia sẻ một đối tượng cố định giữa nhiều lớp thử nghiệm. Ví dụ về cơ sở dữ liệu được sử dụng cho đồ đạc lớp là một ví dụ tuyệt vời: bạn có thể muốn khởi tạo cơ sở dữ liệu với một tập dữ liệu thử nghiệm, sau đó để dữ liệu thử nghiệm đó tại chỗ để nhiều lớp thử nghiệm sử dụng. Bạn có thể sử dụng tính năng cố định bộ sưu tập của xUnit.net để chia sẻ một cá thể đối tượng duy nhất giữa các thử nghiệm trong một số lớp thử nghiệm.
Để sử dụng các thiết bị thu gom, bạn cần thực hiện các bước sau:
Tạo lớp fixture và đặt mã khởi động trong hàm tạo lớp fixture. Nếu lớp fixture cần thực hiện dọn dẹp, hãy triển khai IDisposable trên lớp fixture và đặt mã dọn dẹp trong phương thức Dispose (). Tạo lớp định nghĩa bộ sưu tập, trang trí nó bằng thuộc tính [CollectionDefinition], đặt cho nó một tên duy nhất sẽ xác định bộ sưu tập thử nghiệm. Thêm ICollectionFixture <> vào lớp định nghĩa tập hợp. Thêm thuộc tính [Collection] vào tất cả các lớp thử nghiệm sẽ là một phần của tập hợp, sử dụng tên duy nhất mà bạn đã cung cấp cho thuộc tính [CollectionDefinition] của lớp định nghĩa tập hợp thử nghiệm. Nếu các lớp thử nghiệm cần quyền truy cập vào cá thể fixture, hãy thêm nó làm đối số của hàm tạo và nó sẽ được cung cấp tự động. Đây là một ví dụ đơn giản:
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 xử lý các đồ đạc tập hợp theo cách giống như đồ đạc lớp, ngoại trừ thời gian tồn tại của một đối tượng cố định tập hợp dài hơn: nó được tạo trước khi chạy bất kỳ thử nghiệm nào trong bất kỳ lớp thử nghiệm nào trong tập hợp và sẽ không bị xóa cho đến khi tất cả các lớp thử nghiệm trong bộ sưu tập chạy xong.
Các bộ sưu tập thử nghiệm cũng có thể được trang trí bằng IClassFixture <>. xUnit.net coi điều này như thể mỗi lớp kiểm tra riêng lẻ trong bộ sưu tập bài kiểm tra đã được trang trí bằng lịch thi đấu của lớp.
Các bộ sưu tập kiểm tra cũng ảnh hưởng đến cách xUnit.net chạy các bài kiểm tra khi chạy chúng song song. Để biết thêm thông tin, hãy xem Chạy thử nghiệm song song.
Lưu ý quan trọng: Các đồ đạc phải ở trong cùng một bộ phận với thử nghiệm sử dụng chúng.