2010-08-19 5 views
1

TypeMock 포럼에 게시했지만 응답을 기다리기에는 너무 성급했습니다. 이것은 매우 n00b 질문입니다.메서드에 동작 설정 메서드를 호출하는 것처럼 보입니다

가짜 IContainer를 설정하려고합니다. 여기에 내가 가진 무엇 :

var container = Isolate.Fake.Instance<IContainer>(); 
var program = Isolate.Fake.Instance<IProgram>(); 

Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program); 

(IProgram 내 코드에서 인터페이스입니다).

이 코드를 실행하려고하면 "요청 된 서비스 MyApp.IProgram이 등록되지 않았습니다."라는 Autofac 예외가 발생합니다.

어떻게이 예외를 throw 할 수 있습니까? 나는 실제로 컨테이너를 호출하지 않습니다. 응답(), 맞습니까? 가짜 IProgram을 반환하도록 설정하고 있습니다.

관련없는 배경 정보 : Autofac이 확장 방법을 광범위하게 사용하고 Moq이 모의하지 않기 때문에 TypeMock을 시험하고 있습니다.

답변

3

몇 가지 도움이 될 수 있습니다. 먼저 모든 확장 메소드가 위임 한 IComponentContext.Resolve()을 설정하여 Resolve() 통화를 Moq으로 모의 할 수 있습니다.

둘째, Autofac은 구성 요소의 인터페이스를 사용할 필요가 없도록 설계되었습니다. 예를 참조하십시오 :

Func, IIndex 및/또는 Owned 관계 유형

희망이 도움이됩니다. Nick

+0

대만족 오! 나는 처음 문제를 더 열심히보아야했다. 문제가 해결되었습니다. 고마워 니콜라스! 사실, 부트 스트 래퍼에게 내 응용 프로그램의 한 지점에서 ContainerBuilder를 전달하고 모듈을 올바르게 등록하려고합니다. –

2

불행히도 현재 Autofac 컨테이너를 위조하는 것을 방지하는 Isolator의 버그가 있습니다. Google은 가능한 한 빨리 문제를 해결하기 위해 노력하고 있습니다.

그 동안

, 의도 한대로 당신이 Autofac를 사용하지 않는 이유, 의미가 같은, 그것은 가짜 인스턴스를 반환해야 :

[TestFixture] 
public class TestClass 
{ 
    private ContainerBuilder builder; 
    private IContainer container; 

    [SetUp] 
    public void SetUp() 
    { 
     builder = new ContainerBuilder(); 
    } 

    [Test, Isolated] 
    public void Test1() 
    { 
     var fakeProgram = Isolate.Fake.Instance<IProgram>(); 

     builder.RegisterInstance(fakeProgram).As<IProgram>(); 
     container = builder.Build(); 

     var program = container.Resolve<IProgram>(); 

     Assert.AreEqual(fakeProgram, program); 
    } 
} 
+0

답변 해 주셔서 감사합니다 hmemcpy! 나는 이것을 할 것이지만 실제로 부트 스트 래퍼에게 전달 된 종속성이기 때문에 빌더를 위조하고있다. –