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
相关产品推荐
相关产品推荐

