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

C#中Mock时遇“表达式树不可含可选参数调用”错误如何解决?

解决Moq Mock带可选参数方法的表达式树错误

你遇到的错误是因为原方法包含两个可选参数,但在Moq的Setup表达式中,必须显式列出所有参数,不能省略可选参数——表达式树不支持隐式使用可选参数的语法。

原方法的最后两个参数是可选的:

Action<HttpRequestMessage> addRequestHeader = null,
bool disableSpanLogging = false

你的Mock代码只写到第8个参数,漏掉了这两个,所以触发了错误。只需要在Setup中补充这两个参数的匹配器即可,修改后的代码如下:

_httpClientWrapperMock.Setup(x => x.SendPostRequestAsync<PKKResponse>(
    It.IsAny<LoggingContext>(),
    It.IsAny<string>(),
    It.IsAny<CancellationToken>(),
    It.IsAny<PKKRequest>(),
    It.IsAny<string>(),
    It.IsAny<(IJsonFormatterResolver, IJsonFormatterResolver)>(),
    It.IsAny<Action<HttpStatusCode>>(),
    It.IsAny<Action<HttpRequestMessage>>(), // 原可选参数1
    It.IsAny<bool>() // 原可选参数2
)).ReturnsAsync((responseContainer.Response, responseContainer.StatusCode));

如果需要精准匹配默认值(比如只MockdisableSpanLogging=false的情况),也可以把匹配器换成具体的默认值:

_httpClientWrapperMock.Setup(x => x.SendPostRequestAsync<PKKResponse>(
    It.IsAny<LoggingContext>(),
    It.IsAny<string>(),
    It.IsAny<CancellationToken>(),
    It.IsAny<PKKRequest>(),
    It.IsAny<string>(),
    It.IsAny<(IJsonFormatterResolver, IJsonFormatterResolver)>(),
    It.IsAny<Action<HttpStatusCode>>(),
    null, // 匹配addRequestHeader的默认null值
    false // 匹配disableSpanLogging的默认false值
)).ReturnsAsync((responseContainer.Response, responseContainer.StatusCode));

这样就能解决表达式树的错误,正常完成Mock设置。

内容的提问来源于stack exchange,提问作者rosed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 12:51:35