我正在使用 xUnit 和 Moq 编写测试用例。
我正在尝试模拟 HttpClient 的 PostAsync(),但出现错误。
下面是用于模拟的代码:
public TestADLS_Operations()
{
var mockClient = new Mock<HttpClient>();
mockClient.Setup(repo => repo.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>())).Returns(() => Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
this._iADLS_Operations = new ADLS_Operations(mockClient.Object);
}
错误:
Unsupported expression: repo => repo.PostAsync(It.IsAny(), It.IsAny()) Non-overridable members (here: HttpClient.PostAsync) may not be used in setup / verification expressions.
截图:
最佳答案
Non-overridable members (here: HttpClient.PostAsync) may not be used in setup / verification expressions.
我也试图 mock
HttpClient
和你一样,我得到了同样的错误信息。解决方法:
而不是 mock
HttpClient
, mock HttpMessageHandler
.然后给
mockHttpMessageHandler.Object
给您的 HttpClient
,然后您将其传递给您的产品代码类。这是有效的,因为 HttpClient
用途 HttpMessageHandler
引擎盖下:// Arrange
var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
mockHttpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK });
var client = new HttpClient(mockHttpMessageHandler.Object);
this._iADLS_Operations = new ADLS_Operations(client);
注意:您还需要一个using Moq.Protected;
在测试文件的顶部。然后您可以调用使用
PostAsync
的方法来自您的测试,以及 PostAsync
将返回 HTTP 状态 OK 响应:// Act
var returnedItem = this._iADLS_Operations.MethodThatUsesPostAsync(/*parameter(s) here*/);
优势:
mock
HttpMessageHandler
意味着您的产品代码或测试代码中不需要额外的类。有用的资源:
关于c# - 无法在单元测试中模拟 HttpClient PostAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091410/