2011-11-09 7 views
8

Autofac 컨테이너를 특정 인터페이스로 등록해야합니다.이 경우 모의를 해결하고 싶습니다.moq에 autofac 사용

어떻게하면됩니까?

나는 시도했다 :

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

내가 IStudyLoader 이상의 뭔가를 해결하려면 코드를 변경하지 않지만, Mock<IStudyLoader>IStudyLoader에 대한 대용 아니다; 예 : 은 IStudyLoader을 대신 할 수 있지만 유형이 아니기 때문에 Mock<IStudyLoader>.Object 레지스터는 사용할 수 없습니다.

정확함 제발; 나는 뭔가를 놓치고 있다는 느낌을 가지고있다.

(나는 다른 제한, 내가 ApplicationContainer.GetApplicationContainer() 이외의 용기를 사용할 수 있습니다)

(나는 그것을 수동으로 할 때 테스트 의존성을 주입하는 것이 낫다 생각하지만, 내가 생산 코드이 시간을 변경하지 않으 .)

답변

16

해결책을 찾았습니다. 가능합니다!

http://autofaccn.readthedocs.io/en/latest/integration/moq.html

이것은 당신이 즉시 당신의 단위 테스트에서 종속성을 을 만들 수 있습니다 :이 질문에 질문 되었기 때문에

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

필자는 autofac에 특별한 경험이 없지만, 내가 작업 한 대부분의 다른 컨테이너는 이미 만들어진 객체의 인스턴스를 등록 할 수 있습니다. 그래서 모의 객체를 생성 한 다음 mock.Object를 IStudyLoader 구현으로 등록 할 수 있습니다. 이를 수행하는 방법에 대해서는 autofac 문서를 참고하십시오.

5

당신이 찾고있는 방법은 호출 RegisterInstance : 기존 용기 말했다

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

이미 되지 않습니다 조롱 할 인터페이스에 대한 등록을해야합니다 (케이스 AppContainer에서) 인스턴스을 해결할 수 있습니다. 프로덕션 인스턴스를 계속해서 해결합니다.

내가 따라야 할 것이 강력히 권고하는 "해결 방법"은 테스트에 AppContainer를 포함시키지 않고 테스트에 적합한 컨테이너를 작성하여 사용자가 들어오는 것에 더 잘 제어 할 수 있도록합니다. 효과는 당신이 SUT과 함께 필요한 모의 인스턴스를 등록 할 수 있다는 것입니다.

0

, 지금 AutoFac 의해 지원 AutoFac.Extras.Moq 패키지가있다.

0

오래된 질문,하지만 AutoFac 지금 버전 4.0.1 지원 Moq4 및 추가 패키지를 제공하기 때문에 당신이 Autofac.Extras.Moq

Install-Package Autofac.Extras.Moq 

Autofac.Extras.Moq의 자동 AutoFac 및 MOQ

를 모두 설치 설치할 수 있습니다 당신은 'needn 컨테이너를 만들고 StudyLoader를 등록하십시오. 그것은 Autofac.Extras.Moq에 의해 암묵적으로 정의됩니다.

Autofac.Extras.Moq는 중첩 된 종속성에 유용합니다. 모든 종속성 그래프를 등록 할 필요가 없습니다.

  [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; } 
     } 
: 아래 주어진 만

당신은 당신이 경우 테스트를 구현할 수 있습니다 SystemUnderTest의 SUT 개체 모의