C# Moq如何绕过呼叫基地
我有一个如上所述的类,想为Init方法编写一个单元测试,并模拟了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 }
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);