如何简化用于设置模拟的 It.IsAny<T>() 参数



在单元测试中,我们经常使用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);

相关内容

最新更新