我用一个方法
创建一个模拟对象IMyIterface dosGuard = Mock.Of<IMyIterface >(
dg =>
dg.IsMethod1(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>()) == false
);
我想为其他方法指定谓词:
dg.IsMethod2(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>()) == false
我怎样才能同时为这两种方法做到这一点?
答案 0 :(得分:2)
如果你想在模拟对象上设置多个东西,你不能*使用Mock.Of<T>
工厂方法,你需要自己设置模拟对象:
var dosGuardMock = new Mock<IMyInterface>();
dosGuardMock.Setup(dg => dg.IsMethod1(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>())).Returns(false);
dosGuardMock.Setup(dg => dg.IsMethod2(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>())).Returns(false);
var dosGuard = dosGuardMock.Object;
*或者,您可以使用工厂方法,并使用静态Mock.Get
方法修改工厂方法创建的实例:
var dosGuard = new Mock.Of<IMyInterface>();
Mock.Get(dosGuard).Setup(dg => dg.IsMethod1(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>())).Returns(false);
Mock.Get(dosGuard).Setup(dg => dg.IsMethod2(It.IsAny<IPAddress>(), It.IsAny<string>(), It.IsAny<string>())).Returns(false);
但是,我更喜欢第一个示例,因为它在Mock<T>
实例和“mock”T
实例之间绘制了明显的差异。
答案 1 :(得分:2)
是的,您实际上可以使用Mock.Of<T>()
在工厂内构建整个对象的结构 - 它最初看起来有点古怪:
interface IInterface
{
int IntMethod();
string StringMethod();
}
var instance = Mock.Of<IInterface>(ifc =>
ifc.IntMethod() == 1 &&
ifc.StringMethod() == "Hello");
它使用布尔值作为MemberAssignment,但除此之外,它会读取给我一个模拟的IInterface,IntMethod返回1,StringMethod返回“Hello”。此外,参数的It.IsAny<TType>()
也适用于谓词以及嵌套的Mock.Of<T>
调用。
一旦开始,它会变得更加清晰,并且可以启动静态方法来分配/更新根测试场景:即采用“最佳”模型并调整一些字段,而无需重新键入整个模型