在单元测试中,我们经常使用Mock.Setup
。这导致了以下语句:
_mockedModel.Setup(x => x.Method1(It.IsAny<string>(), It.IsAny<object>(),It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method2(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);
_mockedModel.Setup(x => x.Method3(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<string>())).Returns(1);
_mockedModel.Setup(x => x.Method4(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<object>())).Returns(1);
这非常冗长,我想简化It.IsAny<T>()
参数。
我们尝试了以下操作:
Func<string> s = It.IsAny<string>;
Func<object> o = It.IsAny<object>;
_mockedModel.Setup(x => x.Method1(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method2(s(), o(), o())).Returns(1);
_mockedModel.Setup(x => x.Method3(o(), o(), s())).Returns(1);
_mockedModel.Setup(x => x.Method4(o(), o(), o())).Returns(1);
但是,尽管这没有给出任何错误,但它并没有设置模型。例如,方法1到4返回0而不是1。
但是,尽管这不会产生任何错误,但它不会设置Mock。例如,方法1到4返回0而不是1。
这是因为MoqSetup
在表达式中显式查找It.IsAny<T>()
静态方法调用,以便正确配置设置。这是故意的。
通过在尝试简化表达式时更改为函数,可以强制表达式调用返回泛型类型参数默认值的方法调用。
所以你的表情有效变成
_mockedModel.Setup(x => x.Method1(null, null, null)).Returns(1);
//...
@Nkosi的回答帮助我想出了一个解决方案。解决方案是将It.IsAny((调用放在属性(或方法(内部:
private static string Str => It.IsAny<string>();
private static object Obj => It.IsAny<object>();
这允许按如下方式编写代码:
_mockedModel.Setup(x => x.Method1(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method2(Str, Obj, Obj)).Returns(1);
_mockedModel.Setup(x => x.Method3(Obj, Obj, Str)).Returns(1);
_mockedModel.Setup(x => x.Method4(Obj, Obj, Obj)).Returns(1);