2012-05-09 6 views
1
public class MyClass: AbstractBase 
{ 
    public override bool Init(IAppContext contextIn) 
    { 
     if (base.Init(contextIn)) 
     { 
      //my code 
     } 
    } 
} 

위와 같은 클래스가 있고 Init 메서드에 대한 단위 테스트를 작성하고 IAppContext을 조롱했습니다. mock을 사용하여 기본 호출을 무시할 수 있습니까? Moq 기본 호출을 우회하는 방법

내가 뭐하는 거지입니다 :

Mock<IAppContext> mockContex = new Mock<IAppContext >(); 
MyClass myClassInstance - new MyClass(); 
myClassInstance.Init(mockContex.object); 

을 등 base.init 보인다 :

public virtual bool Init(IAppContext context_in) 
{ 
    if (context_in == null) 
    { 
     throw new ArgumentNullException("context_in", "IAppContext argument s null"); 
    } 
    this.myCommunication = context_in.getInterface<ICommunication>(); 
    if (this.myCommunication == null) 
    { 
     throw new ArgumentNullException("myCommunication", "ICommunication argument is null"); 
    } 
    this.myStateManager = new IStateManager(this.myCommunication); 
    if (this.myStateManager == null) 
    { 
     throw new InvalidOperationException("Could not create the State Manager"); 
    } 
    return true; 
} 
+0

Moq로 기본 호출을 바이 패스 할 수 없습니다. 당신이 할 수있는 것은'base.Init (contextIn)'이 true를 리턴하는 방식으로'mockContex'를 설정하는 것입니다. 당신은'base.Init'이 어떻게 생겼는지 게시 할 수 있습니까? – nemesv

+0

public 가상 BOOL 초기화 (IAppContext의 context_in) {경우 (context_in == NULL) { 스로인 경우 ArgumentNullException 새로운 ("context_in"(널 IAppContext 인수 S ');} this.myCommunication = context_in.getInterface (); 경우 (this.myCommunication == NULL) { 스로인 경우 ArgumentNullException 새로운 ("myCommunication", "ICommunication 인수가 null");} this.myStateManager = 새로운있는 IStateManager (this.myCommunication) 경우 (this.myStateManager == null) { throw new InvalidOperationException ("상태 관리자를 만들지 못했습니다."); } return true; } } –

답변

1

당신은 설정하는 방법에 IAppContext 모의 base.Init는 true를 돌려줍니다 수 :

var communicationFake = new Mock<ICommunication>(); 
var appContextMock = new Mock<IAppContext>(); 

appContextMock 
    .Setup(c => c.getInterface<ICommunication>()) 
    .Returns(communicationFake.Object); 

이제 base.Init은을 반환합니다.appContextMock으로 전화 할 때.

마지막 null 확인 (this.myStateManager == null)이 필요하지 않습니다. new IStateManager(this.myCommunication)이 실패하는 유일한 방법은 예외를 throw하는 것입니다. 그렇다면, 어쨌든 널 체크 부분에 도달하지 않을 것입니다.