如何使用 xunit c# 模拟 Httpclient 方法内部

问题描述 投票:0回答:1

我正在尝试模拟使用 using 关键字在方法内创建的 Httpclient 请参阅以下示例。

Public string testmethod{

Using(Httpclient client = new Httpclient (){
Var content = "some content"
String url = "xxxx"
Client.defaultrequestheader(key,value);
Var response = client.postasync(uri,content)
})
}

我如何模拟上述大部分场景 Httpclient 在构造函数中初始化。

c# unit-testing mocking httpclient xunit
1个回答
1
投票

您正在使用

HttpCLient
关键字创建
new
的新实例,引入对所述类的硬依赖,并且不能模拟它。

您可以选择一些来模拟

HttpClient
,但您需要使用
IHttpClientFactory
来模拟它:

  • 使用 DI - 所以用
    IHttpClientFactory
    定义构造函数,它将被注入并使用 `Create 方法来获取客户端,
  • IHttpClientFactory
    的实例传递给该方法,然后使用它创建客户端

在这两个选项中,您都可以模拟

Create
方法 - 这样您就可以从中返回模拟的
HttpClient

为了模拟客户端,请参考下面的代码

var mockMessageHandler = new Mock<HttpMessageHandler>();
mockMessageHandler.Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync", 
        ItExpr.IsAny<HttpRequestMessage>(), 
        ItExpr.IsAny<CancellationToken>())
    .ReturnsAsync(new HttpResponseMessage 
    {
        StatusCode = HttpStatusCode.OK,
        Content = new StringContent("test content")
    });
var underTest = new SiteAnalyzer(new HttpClient(mockMessageHandler.Object));
© www.soinside.com 2019 - 2024. All rights reserved.