【发布时间】:2021-02-25 21:57:27
【问题描述】:
我无法模拟 Moq。
通常有一个HttpClient 我会通过在基类中注入HttpClient 来模拟它,如下所示:
public class MyClass
{
private readonly HttpClient httpClient;
public MyClass(HttpClient httpClient)
{
this.httpClient = httpClient;
}
}
但现在我的班级 MyClass 中有不同的函数,需要像这样自定义 HttpClientHandler:
HttpClientHandler httpClientHandler = new HttpClientHandler();
...
using var client = new HttpClient(httpClientHandler);
如果我只是在MyClassTest 中注入HttpClient 和var service = new MyClass(httpMock.Object);,那么httpClient 将被覆盖。
什么是测试我的功能而不是进行真正的 HTTP 调用的正确方法?
【问题讨论】:
-
您应该查看
IHttpClientFactory并输入/命名HttpClientinjection。 -
1) 创建一个仅测试重载,您可以在其中传入自定义处理程序。多年来,我一直在使用这种方法并取得了巨大的成功。 2)将类抽象为 HttpClient 并注入它。从理论上讲,您的抽象应该设计为接口,并且您可以隐藏它们甚至使用 HTTP 的事实。
-
我选择了
public MyClass(HttpClientHandler httpClientHandler = null),然后用模拟调用它:var mockHttpMessageHandler = new Mock<HttpClientHandler>();。它可以完成这项工作,我只是不确定它有多“干净”或“最佳实践”。
标签: c# unit-testing asp.net-core asp.net-core-webapi moq