Không sử dụng hộp chứa DI trong các thử nghiệm đơn vị của bạn. Trong các bài kiểm tra đơn vị, bạn cố gắng kiểm tra một lớp hoặc mô-đun trong sự cô lập, và có rất ít sử dụng cho một thùng chứa DI trong khu vực đó.
Mọi thứ khác với thử nghiệm tích hợp, vì bạn muốn kiểm tra xem các thành phần trong hệ thống của bạn tích hợp và hoạt động cùng nhau như thế nào. Trong trường hợp đó, bạn thường sử dụng cấu hình DI sản xuất của mình và hoán đổi một số dịch vụ của bạn cho các dịch vụ giả mạo (chẳng hạn như MailService
) nhưng hãy gắn bó với thực tế nhất có thể.Trong trường hợp này, bạn sử dụng vùng chứa của mình để giải quyết toàn bộ đồ thị đối tượng.
Mong muốn sử dụng hộp chứa DI trong các thử nghiệm đơn vị cũng thường xuất phát từ các mẫu không hiệu quả. Ví dụ, trong trường hợp bạn cố gắng tạo lớp dưới sự kiểm tra với tất cả các phụ thuộc của nó trong mỗi bài kiểm tra, bạn sẽ nhận được rất nhiều mã khởi tạo trùng lặp, và một chút thay đổi trong lớp của bạn trong bài kiểm tra có thể trong trường hợp đó gợn qua hệ thống và yêu cầu bạn thay đổi hàng chục bài kiểm tra đơn vị. Điều này rõ ràng là nguyên nhân gây ra vấn đề bảo trì.
Một mô hình đã giúp tôi thực hiện điều này rất nhiều trong quá khứ là việc sử dụng phương pháp nhà máy cụ thể cho từng lớp thử nghiệm đơn giản. Phương thức này tập trung vào việc tạo ra các lớp đang được kiểm tra và giảm thiểu số lượng các thay đổi cần phải được thực hiện khi các phụ thuộc của lớp dưới sự thay đổi thử nghiệm. Đây là cách phương thức nhà máy như vậy có thể trông giống như:
private ClassUnderTest CreateValidClassUnderTest(params object[] dependencies) {
return new ClassUnderTest(
dependencies.OfType<ILogger>().SingleOrDefault() ?? new FakeLogger(),
dependencies.OfType<IMailSender>().SingleOrDefault() ?? new FakeMailer(),
dependencies.OfType<IEventPublisher>().SingleOrDefault() ?? new FakePublisher());
}
Phương thức nhà máy này chứa một sự phụ thuộc. Mã trích xuất các phụ thuộc từ danh sách và trong trường hợp một phụ thuộc cụ thể bị thiếu, một triển khai giả mới sẽ được tiêm.
Tác phẩm này, vì trong hầu hết các thử nghiệm, bạn chỉ quan tâm đến một hoặc hai phụ thuộc. Các phụ thuộc khác được yêu cầu cho lớp hoạt động, nhưng không thú vị đối với thử nghiệm cụ thể. Do đó, phương pháp nhà máy cho phép bạn chỉ cung cấp các phụ thuộc thú vị cho thử nghiệm trong tầm tay, đồng thời loại bỏ nhiễu của các phụ thuộc không sử dụng. Do đó, phương pháp nhà máy cho phép bạn viết các bài kiểm tra sau:
public void Test() {
// Arrange
var logger = new ListLogger();
var cut = CreateValidClassUnderTest(logger);
// Act
cut.DoSomething();
// Arrange
Assert.IsTrue(logger.Count > 0);
}
Nếu bạn muốn tìm hiểu làm thế nào để viết Trustworthy và duy trì kiểm tra có thể đọc, tôi khuyên bạn nên đọc cuốn sách Roy Osherove của The Art of Testing Unit (ấn bản thứ hai). Điều này đã giúp tôi rất nhiều.
Không chắc chắn bạn đang tìm kiếm mẫu nào. Tại sao không chỉ làm cho các thùng chứa của bạn trong khởi tạo thử nghiệm (constructor cho xunit, ví dụ)? Các mô hình là đơn giản - thành phần. – Artyom
Nếu bạn thực sự quan tâm đến các mẫu thử nghiệm đơn vị, bạn nên đọc [Mẫu thử nghiệm xUnit] (https://www.amazon.co.uk/xUnit-Test-Patterns-Refactoring-Code-ebook/dp/B004X1D36K/ref = dp_kinw_strp_1). – Steven