模拟几个谓词

时间:2014-04-08 22:10:22

标签: c# mocking moq

我用一个方法

创建一个模拟对象
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

我怎样才能同时为这两种方法做到这一点?

2 个答案:

答案 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>调用。

一旦开始,它会变得更加清晰,并且可以启动静态方法来分配/更新根测试场景:即采用“最佳”模型并调整一些字段,而无需重新键入整个模型