使用Moq模拟HttpClient.SendAsync时报方法为公开错误如何修复?
错误根因
System.ArgumentException: Method HttpClient.SendAsync is public. Use strong-typed Expect overload instead: mock.Setup(x => x.SendAsync());
报错的核心原因是HttpClient.SendAsync属于公开方法,而你在代码中调用了Protected()扩展,这个API是Moq专门用于配置类的非公开受保护成员的,不能用于公开方法,因此触发校验报错。
修复方案
两种可选方案,按需选择:
方案1:直接调整现有代码(改动最小)
删除Protected()调用,改用强类型的Lambda写法配置公开方法即可,修改后的代码如下:
autoMock.Mock<HttpClient>() .Setup(x => x.SendAsync( It.IsAny<HttpRequestMessage>(), It.IsAny<CancellationToken>() )) .ReturnsAsync(httpResponseMessage) .Verifiable();
方案2:Mock HttpMessageHandler(业界通用推荐方案)
HttpClient 本身只是上层封装,真正执行请求的是内部的HttpMessageHandler,对Handler做Mock更贴近真实运行逻辑,也可以覆盖自定义Handler、请求管道之类的场景,写法如下:
// 先Mock HttpMessageHandler的受保护SendAsync方法 var mockHandler = autoMock.Mock<HttpMessageHandler>(); mockHandler.Protected() .Setup<Task<HttpResponseMessage>>( "SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>() ) .ReturnsAsync(httpResponseMessage) .Verifiable(); // 后续AutoMock会自动将Mock的Handler注入到HttpClient,或者你可以手动构造实例 var client = new HttpClient(mockHandler.Object);
内容的提问来源于stack exchange,提问作者iloveseven
相关产品推荐
相关产品推荐

