我正在使用 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);
}
Error:
不支持的表达式:repo => repo.PostAsync(It.IsAny(),
It.IsAny()) 不可重写的成员(此处:
HttpClient.PostAsync) 不得在设置/验证中使用
表达式。
截屏:
不可重写的成员(此处:HttpClient.PostAsync)不得在设置/验证表达式中使用。
我也试图嘲笑HttpClient
和你一样,我也得到了同样的错误信息。
解决方案:
而不是嘲笑HttpClient
,嘲笑HttpMessageHandler
.
然后给出mockHttpMessageHandler.Object
给你的HttpClient
,然后将其传递给您的产品代码类。这有效是因为HttpClient
uses 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*/);
优势:嘲笑HttpMessageHandler
意味着您不需要在产品代码或测试代码中添加额外的类。
有用的资源:
- 使用 HttpClient 进行单元测试 https://chrissainty.com/unit-testing-with-httpclient/
- 如何在 .NET / C# 单元测试中模拟 HttpClient https://gingter.org/2018/07/26/how-to-mock-httpclient-in-your-net-c-unit-tests/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)