繁体   English   中英

如何简化 It.IsAny<t> () 用于设置 Mocks 的参数</t>

[英]How to simplify the It.IsAny<T>() parameters for setting up Mocks

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

但是,虽然这没有给出任何错误,但它并没有设置 Mock。 例如,方法 1 到 4 返回 0 而不是 1。

但是,虽然这没有给出任何错误,但它并没有设置 Mock。 例如,方法 1 到 4 返回 0 而不是 1。

这是因为 Moq Setup明确地在表达式中查找It.IsAny<T>() static 方法调用,以便正确配置设置。 这是设计使然。

通过更改为 function 以尝试简化表达式,您可以强制表达式调用返回泛型类型参数的默认值的方法调用。

所以你的表达效果就变成了

_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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM