Moq如何绕过对基地的呼叫

时间:2012-05-09 05:09:22

标签: c# unit-testing moq

public class MyClass: AbstractBase
{
    public override bool Init(IAppContext contextIn)
    {
        if (base.Init(contextIn))
        {
            //my code 
        }
    }
}

我有一个上面给出的类,想要为Init方法编写一个单元测试,并模拟了IAppContext。我如何使用mock绕过对base的调用?

这就是我在做的事情:

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; 
} 

1 个答案:

答案 0 :(得分:1)

您可以IAppContext将返回true的方式设置base.Init模拟:

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

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

使用base.Init调用时,true将返回appContextMock

请注意,您不需要上次空检查(this.myStateManager == null) - new IStateManager(this.myCommunication)失败的唯一方法是抛出异常。如果确实如此,那么无论如何都无法检查零件。