2011-11-09 13 views
8

Tôi cần đăng ký vùng chứa Autofac của mình với giao diện cụ thể, trong trường hợp này tôi muốn giải quyết mô hình.Sử dụng autofac với moq

Tôi có thể làm như thế nào?

Tôi đã thử:

var AppContainer = ApplicationContainer.GetApplicationContainer(); 
var cb = new ContainerBuilder(); 
cb.RegisterType<Mock<IStudyLoader>>().As<IStudyLoader>().SingleInstance(); 
cb.Update(AppContainer); 

Tôi không muốn thay đổi mã của tôi để giải quyết cái gì khác hơn IStudyLoader, nhưng Mock<IStudyLoader> là không thể thay thế cho IStudyLoader; ví dụ: Mock<IStudyLoader>.Object có thể thay thế cho IStudyLoader, nhưng tôi không thể đăng ký Mock<IStudyLoader>.Object vì đó không phải là loại.

Hãy sửa tôi; Tôi có cảm giác rằng tôi đang thiếu cái gì đó.

(Tôi có một hạn chế, tôi không thể sử dụng container khác hơn ApplicationContainer.GetApplicationContainer())

(Tôi nghĩ rằng nó tốt hơn để tự tiêm phụ thuộc khi thử nghiệm, nhưng tôi không muốn thay đổi mã sản xuất thời gian này .)

Trả lời

16

Tôi đã tìm thấy giải pháp, Có thể thực hiện được!

var AppContainer = ApplicationContainer.GetApplicationContainer(); 
    var studyLoaderMock = new Mock<IStudyLoader>().Object; 
    cb.RegisterInstance(studyLoaderMock).As<IStudyLoader>(); 
    cb.Update(AppContainer); 
1

Tôi không có kinh nghiệm cụ thể với autofac, nhưng hầu hết các container khác mà tôi đã làm việc với cho phép đăng ký một thể hiện của đối tượng, đã được tạo ra. Vì vậy, bạn có thể tạo mô hình của bạn, và sau đó đăng ký mock.Object như thực hiện cho IStudyLoader. Tham khảo tài liệu autofac về cách thực hiện việc này.

5

Phương pháp bạn đang tìm kiếm được gọi là RegisterInstance:

var mock = ...; 
var cb = new ContainerBuilder(); 
cb.RegisterInstance(mock.Object); 
var container = cb.Build(); 

Điều đó nói rằng, một vùng chứa hiện tại (trong trường hợp của bạn AppContainer) mà đã có một đăng ký cho giao diện bạn muốn chế nhạo sẽ không có thể giải quyết cá thể. Nó sẽ tiếp tục giải quyết trường hợp sản xuất.

Giải pháp "" mà tôi khuyên bạn nên theo dõi, không liên quan đến AppContainer trong bài kiểm tra của bạn, mà là xây dựng một thùng chứa phù hợp cho thử nghiệm của bạn để bạn có thể kiểm soát tốt hơn những gì đi vào đó. Hiệu ứng là bạn có thể đăng ký bất kỳ ví dụ giả nào bạn cần cùng với SUT.

0

Cũ Câu hỏi, nhưng AutoFac Bây giờ kể từ phiên bản 4.0.1 hỗ trợ Moq4 và cung cấp thêm gói bạn có thể cài đặt Autofac.Extras.Moq

Install-Package Autofac.Extras.Moq 

Autofac.Extras.Moq tự động cài đặt cả hai AutoFac và Moq

Bạn needn' t để tạo một Container và đăng ký StudyLoader. Nó được xác định ngầm bởi Autofac.Extras.Moq.

Autofac.Extras.Moq có giá trị cho phụ thuộc lồng nhau. Bạn không quan tâm để đăng ký tất cả các đồ thị phụ thuộc. Chỉ Mock SystemUnderTest đối tượng SUT của bạn

Bạn có thể thực hiện bạn kiểm tra trường hợp như đưa ra dưới đây:

  [TestFixture] 
     class StudyLoaderTest 
     { 
      [Test] 
      public void Test() 
      { 
       using (var mock = AutoMock.GetLoose()) 
       { 
        // The AutoMock class will inject a mock IStudyLoader 
        // into the StudyLoader constructor 
        //no need to create/configure a container 
        var studyLoader = mock.Create<StudyLoader>();    
        Assert.AreEqual("hi AutoFac Moq", studyLoader.Name); 
       } 
      } 
     } 

     class StudyLoader : IStudyLoader 
     { 
      public string Name { get; set; } = "hi AutoFac Moq"; 
     } 
     interface IStudyLoader 
     { 
      string Name { get; set; } 
     }