6

Tôi đang sử dụng khung công tác Simple Injector Dependency Injection và nó trông đẹp và đẹp mắt. Nhưng sau khi xây dựng một cấu hình và sử dụng nó, bây giờ tôi muốn biết làm thế nào để thay đổi từ một cấu hình khác.Sử dụng các cấu hình khác nhau với Simple Injector

Kịch bản: Hãy tưởng tượng tôi đã thiết lập cấu hình trong Global Asax và tôi có phiên bản công khai và toàn cầu Container ở đó. Bây giờ tôi muốn thực hiện một số bài kiểm tra và tôi muốn họ sử dụng các lớp mô hình vì vậy tôi muốn thay đổi cấu hình.

Tôi có thể, tất nhiên, xây dựng cấu hình khác và gán nó cho toàn cầu Container được tạo theo mặc định, để mỗi khi tôi chạy thử nghiệm, cấu hình thay thế sẽ được đặt. Nhưng khi làm điều đó và mặc dù tôi đang ở trong bối cảnh phát triển, thì Container được thay đổi cho mọi người, ngay cả đối với các yêu cầu bình thường. Tôi biết tôi đang thử nghiệm trong bối cảnh này và điều đó không quan trọng, nhưng tôi có cảm giác rằng đây không phải là cách để làm điều này ... và tôi tự hỏi làm thế nào để thay đổi từ một cấu hình khác trong một cách chính xác.

+0

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. –

Trả lời

6

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.

+0

Cảm ơn. Nó có vẻ là những gì tôi đã tưởng tượng. –