C# Moq如何绕过呼叫基地

C# Moq如何绕过呼叫基地,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个如上所述的类,想为Init方法编写一个单元测试,并模拟了IAppContext。如何使用mock绕过对base的调用 这就是我正在做的: public class MyClass: AbstractBase { public override bool Init(IAppContext contextIn) { if (base.Init(contextIn)) { //my code }

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

这就是我正在做的:

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

您可以设置
IAppContext
mock,使
base.Init
返回true:

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; 
} 
var communicationFake=new Mock();
var appContextMock=new Mock();
appContextMock
.Setup(c=>c.getInterface())
.Returns(communicationfalse.Object);
现在,当使用
appContextMock
调用
base.Init时,它将返回
true


请注意,您不需要最后一次空检查(
this.myStateManager==null
)-新IStateManager(this.myCommunication)
失败的唯一方法是引发异常。如果是这样,它无论如何都不会得到空检查部分。

您可以设置
IAppContext
mock,使
base.Init
返回true:

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; 
} 
var communicationFake=new Mock();
var appContextMock=new Mock();
appContextMock
.Setup(c=>c.getInterface())
.Returns(communicationfalse.Object);
现在,当使用
appContextMock
调用
base.Init时,它将返回
true


请注意,您不需要最后一次空检查(
this.myStateManager==null
)-新IStateManager(this.myCommunication)
失败的唯一方法是引发异常。如果它这样做了,它无论如何都不会进入空检查部分。

您不能用Moq绕过对base的调用。您可以做的是以
base.Init(contextIn)
返回true的方式设置
mockContex
。你能发布基本.Init的外观吗?公共虚拟bool Init(IAppContext context_in){if(context_in==null){throw new ArgumentNullException(“context_in”,“IAppContext argument s null”);}this.myCommunication=context_in.getInterface();if(this.myCommunication==null){throw new ArgumentNullException(“myCommunication,“ICommunication参数为null”);}this.myStateManager=new-IStateManager(this.myCommunication);if(this.myStateManager==null){抛出新的InvalidOperationException(“无法创建状态管理器”);}返回true;}}你不能用Moq绕过对base的调用。你能做的是以
base.Init(contextIn)
返回true的方式设置
mockcontext
。你能告诉我base.Init看起来怎么样吗?public virtual bool Init(IAppContext context_in){if(context_in==null){抛出新的ArgumentNullException(“context_in”,(IAppContext参数s null”);}this.myCommunication=context_in.getInterface();if(this.myCommunication==null){抛出新参数NullException(“myCommunication”,“icomunication参数为null”);}this.myStateManager=new IStateManager(this.myCommunication==null){抛出新的InvalidOperationException(“无法创建状态管理器”);}返回true;}
var communicationFake = new Mock<ICommunication>();
var appContextMock = new Mock<IAppContext>();

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