Khi thực hiện kiểm tra đơn vị, bạn hoàn toàn không nên sử dụng vùng chứa. Chỉ cần tạo lớp dưới sự kiểm tra bằng cách gọi hàm tạo của nó và cung cấp nó với các đối tượng giả thích hợp.
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 đượ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 kiểm tra. Đâ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());
}
Để kiểm tra tích hợp, việc sử dụng thùng chứa và trao đổi phụ thuộc ít hơn. Tuy nhiên, các kiểm thử tích hợp này sẽ không sử dụng vùng chứa mà bạn đã tạo trong application_start của mình, nhưng mỗi kiểm thử tích hợp trong trường hợp đó rất có thể có cá thể chứa mới của riêng nó, vì mỗi thử nghiệm nên chạy riêng biệt. Và ngay cả khi bạn đã sử dụng một vùng chứa duy nhất từ application_start, các thử nghiệm tích hợp của bạn được chạy từ một dự án riêng biệt và sẽ không can thiệp vào ứng dụng đang chạy của bạn.
Mặc dù mỗi thử nghiệm tích hợp sẽ nhận được phiên bản vùng chứa riêng (nếu có), bạn vẫn muốn sử dụng lại nhiều mã cấu hình vùng chứa nhất có thể. Điều này có thể được thực hiện bằng cách trích xuất mã này thành một phương thức trả về một cá thể container đã được cấu hình mới khi được gọi, hoặc cấu hình một cá thể chứa được cung cấp (và trả về không có gì). Phương pháp này thường sẽ làm một cấu hình không đầy đủ và người gọi (hoặc các thử nghiệm của bạn hoặc asax toàn cầu) nên thêm các cấu hình còn thiếu.
Trích xuất mã này: cho phép bạn có nhiều ứng dụng kết thúc chia sẻ cùng một cấu hình; cho phép bạn xác minh vùng chứa trong thử nghiệm tích hợp; và cho phép bạn thêm các dịch vụ cần được thử nghiệm tích hợp của bạn.
Để làm cho cuộc sống trở nên dễ dàng hơn, Injector đơn giản cho phép bạn thay thế các đăng ký hiện tại bằng một đăng ký mới (ví dụ như mô hình được giả lập). Bạn có thể bật tính năng này như sau:
container.Options.AllowOverridingRegistrstions = true;
Nhưng hãy cẩn thận với điều này! Tùy chọn này có thể ẩn thực tế là bạn vô tình ghi đè đăng ký. Theo kinh nghiệm của tôi, trong hầu hết các trường hợp, tốt hơn hết là xây dựng một thùng chứa chưa hoàn chỉnh và thêm các đăng ký còn thiếu sau đó thay vì ghi đè chúng. Hoặc nếu bạn quyết định ghi đè, hãy bật tính năng này vào thời điểm cuối cùng có thể để ngăn chặn bất kỳ lỗi định cấu hình sai tình cờ nào.
Bạn đang nói về việc thiết lập thử nghiệm tự động?Nếu vậy, chỉ cần xây dựng lại các container (sử dụng mocks khi cần thiết) trước mỗi trường hợp thử nghiệm. Đây là '[TestInitialize]' trong MSTest và '[SetUp]' trong NUnit. –