Moq搭建Mock时能否不用逐参数写It.IsAny实现懒人配置?
Moq 原生并没有提供你想要的完全省略参数的懒人配置模式,其设计要求 Setup 表达式中的参数列表必须与目标方法签名匹配,直接写 newMockClient.Setup(x=>x.DoSomething()).Returns(blah); 会触发编译错误。
不过你可以通过以下几种方案大幅简化配置代码,达到类似懒人配置的效果:
方案一:自定义扩展方法封装重复逻辑
针对你常用的方法写专属扩展方法,把所有It.IsAny<T>()的逻辑封装在内部:public static class WorkClientMockExtensions { public static ISetup<WorkClient> SetupDoSomething(this Mock<WorkClient> mock) { return mock.Setup(x => x.DoSomething( It.IsAny<string>(), It.IsAny<int>(), It.IsAny<ServiceClientCredential>(), It.IsAny<CancellationToken>() )); } }封装后你就可以直接调用:
newMockClient.SetupDoSomething().Returns(blah);和你预期的写法几乎完全一致,适配单个项目高频使用的方法时效率极高。
方案二:通用反射实现多场景兼容
如果你需要适配大量不同类、不同方法的懒人Setup,可以基于反射写通用扩展方法,自动为目标方法的所有参数填充It.IsAny<T>表达式,单元测试场景下的性能损耗完全可以忽略。
内容的提问来源于stack exchange,提问作者FoxDeploy
相关产品推荐
相关产品推荐

