【发布时间】:2022-01-28 21:07:27
【问题描述】:
我正在使用moq 创建单元测试,但我无法弄清楚如何将此框架应用到我的程序中处理使用HttpClient 的部分。我发现有各种资源可以演示如何直接模拟 HttpClient 响应,但我的应用程序使用 HttpClient 的方式与使用 Threads 的方式略有不同。
测试的骨架:
public class MyTestClass
{
public void myTest()
{
ClassA classObj = new ClassA();
classObj.Start();
// I'd like to use moq somewhere here to mock the response that occurs in DoThreadStuff() below
}
}
正在测试的类:
public class ClassA
{
private readonly Thread _myThread;
private HttpClient _client;
public ClassA()
{
// initialize some values
_myThread = new Thread(DoThreadStuff);
}
public void Start()
{
_myThread.Start(); // starts DoThreadStuff()
}
private void DoThreadStuff()
{
var newClient = getNewHttpClient(); // utility function returns a HttpClient
var response = newClient.GetAsync("/my/api/status/endpoint");
}
}
如您所见,当ClassA.Start() 被调用时,一个新的HttpClient 被创建并通过GetAsync 使用。为这个构建测试的正确方法是什么?我是否必须更改现有课程的实施以适应最小起订量?有没有人有类似的经验,我可以看看?
【问题讨论】:
-
您需要模拟
getNewHttpClient方法以返回正确设置的 HttpClient 模拟。除此之外,您的用例与其他用例没有太大不同。 -
您可以注入一些工厂来创建 httpclient,这样您就可以模拟工厂(以及 httpclient 本身)。
-
@IsaacPerez 能否分享一下
getNewHttpClient的代码? -
@PeterCsala
getNewHttpClient()只返回一些基本的 HttpClient 对象,然后用于随后的getAsync()调用。我认为getNewHttpClient()的内部结构无关紧要。 -
@PeterCsala 当然,请这样做。我想我不明白
标签: c# unit-testing mocking moq dotnet-httpclient