Moq设置含可选参数方法时报表达式树不可使用可选参数错误如何解决
问题原因
这个报错是因为Moq的Setup方法接收的参数为C#表达式树,而表达式树语法不支持省略可选参数的调用写法。你定义的GetById<T>方法包含可选参数bool fixId = false,你在Setup时只传入了第一个id参数,虽然正常C#代码可以省略可选参数、由编译器自动补全默认值,但这种写法在表达式树中不被允许,因此触发错误。
解决方法
方法1:显式传入可选参数的默认值
直接在Setup的方法调用中补全第二个可选参数的默认值false即可,修改后的Mock设置代码如下:
Mock<IMongoDBService> resMock = new Mock<IMongoDBService>(); resMock.Setup(x => x.GetById<Reservation>(request.ReferenceNumber, false)).Returns(res1);
这种写法和你实际业务代码中的调用逻辑完全匹配,仅当业务代码调用GetById时省略fixId参数(即实际传入默认值false)时,才会命中这个Mock规则。
方法2:匹配任意fixId参数值
如果你不需要限制fixId参数的取值,不管业务代码传入什么值都要返回res1,可以用Moq的参数匹配器It.IsAny<bool>()匹配任意bool类型的参数:
Mock<IMongoDBService> resMock = new Mock<IMongoDBService>(); resMock.Setup(x => x.GetById<Reservation>(request.ReferenceNumber, It.IsAny<bool>())).Returns(res1);
内容的提问来源于stack exchange,提问作者dros
相关产品推荐
相关产品推荐

