2009-10-15 42 views
5

Tôi đang làm một bài kiểm tra đơn vị trên một lớp có sử dụng khung tiêm phụ thuộc thống nhất.Thử nghiệm đơn vị với ServiceLocator

Điều này trả về null: ServiceLocator.Current.GetInstance();

Làm cách nào để tôi trả lại đối tượng giả hoặc chỉ đối tượng?

Trả lời

4

MSDN có ví dụ này hiển thị how to implement the service locator pattern with Unity. Về cơ bản, bạn nên chuyển đối tượng định vị dịch vụ như là một đối số hàm tạo của lớp của bạn. Điều này cho phép bạn vượt qua một MockUnityResolver, cho phép bạn kiểm soát hoàn toàn trong một bài kiểm tra đơn vị.

[TestMethod] 
public void InitCallsRunOnNewsController() 
{ 
    MockUnityResolver container = new MockUnityResolver(); 
    var controller = new MockNewsController(); 
    container.Bag.Add(typeof(INewsController), controller); 
    var newsModule = new NewsModule(container); 

    newsModule.Initialize(); 

    Assert.IsTrue(controller.RunCalled); 
} 
1

Bạn có đang thử nghiệm mã "tích hợp DI" cốt lõi của mình không? Nếu không, mã bình thường của bạn sẽ không bao giờ (tốt, hiếm khi) tương tác với khung DI của bạn.

Thông thường, các phụ thuộc của bạn sẽ được tiêm thông qua việc xây dựng, và khi thử nghiệm, bạn có thể cung cấp các đối tượng giả như những phụ thuộc hàm dựng đó. Ví dụ:

public class Foo { 
    public Foo (IBar bar) { 
     bar.Lift(); 
    } 
} 

Với mã trên, bạn có thể chỉ cần giả lập IBar và chuyển nó cho hàm tạo Foo.

4

Bạn có thể sử dụng tiêm của Poor Man. Tạo một hàm tạo mặc định để truy lục các phụ thuộc từ trình định vị dịch vụ và chuyển tiếp các phụ thuộc đó tới một hàm tạo "thực" để lấy chúng làm tham số. Điều đó sẽ chăm sóc tình huống sản xuất.

Sau đó, khi kiểm tra lớp được đề cập, hãy chuyển vào phiên bản giả/giả của phụ thuộc vào hàm tạo "thực", bỏ qua hoàn toàn mặc định.