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;
}
答案 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)
失败的唯一方法是抛出异常。如果确实如此,那么无论如何都无法检查零件。