You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:36:01