asp.net c#单元测试httpclient异步后

jk9hmnmh  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(161)

我对测试很陌生。我试图理解我如何进行单元测试,因为我并不真的需要真正触发这些服务,但可能会模拟每一步。
如何对以下代码段进行单元测试?

public void myFunction()
{
// I am getting an auth token from a service
// then 

    using (HttpClient httpClient = new HttpClient())
    {
    // do a POST call on another service
    var response = httpClient.PostAsync(url, content);
    }

}
yrwegjxp

yrwegjxp1#

不可重写的成员(此处为:HttpClient.PostAsync)不能在安装/验证表达式中使用。
我还尝试以您所做的相同方式模拟HttpClient,但我得到了相同的错误消息。
不可重写的成员(此处为:HttpClient.PostAsync)不能在安装/验证表达式中使用。
我还尝试以您所做的相同方式模拟HttpClient,但我得到了相同的错误消息。

解决方案:模拟HttpMessageHandler,而不是模拟HttpClient。

然后给予
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响应:

var returnedItem = this._iADLS_Operations.MethodThatUsesPostAsync(/*parameter(s) here*/);

优点:模拟HttpMessageHandler意味着您不需要在产品代码或测试代码中使用额外的类。
有用资源:
https://chrissainty.com/unit-testing-with-httpclient/
https://gingter.org/2018/07/26/how-to-mock-httpclient-in-your-net-c-unit-tests/

41zrol4v

41zrol4v2#

模拟安排后,可通过

mockHttpMessageHandler.Protected().Verify("SendAsync", Times.Once(), ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>());

相关问题