我在尝试包装我的代码以便在单元测试中使用时遇到了一些问题。问题是这样的。我有接口(interface) IHttpHandler
:
public interface IHttpHandler
{
HttpClient client { get; }
}
以及使用它的类,HttpHandler
:
public class HttpHandler : IHttpHandler
{
public HttpClient client
{
get
{
return new HttpClient();
}
}
}
然后是 Connection
类,它使用 simpleIOC 来注入(inject)客户端实现:
public class Connection
{
private IHttpHandler _httpClient;
public Connection(IHttpHandler httpClient)
{
_httpClient = httpClient;
}
}
然后我有一个包含这个类的单元测试项目:
private IHttpHandler _httpClient;
[TestMethod]
public void TestMockConnection()
{
var client = new Connection(_httpClient);
client.doSomething();
// Here I want to somehow create a mock instance of the http client
// Instead of the real one. How Should I approach this?
}
现在很明显,我将在 Connection
类中使用一些方法,这些方法将从我的后端检索数据 (JSON)。但是,我想为这个类编写单元测试,显然我不想针对真实后端编写测试,而是针对模拟后端编写测试。我试图用谷歌搜索一个很好的答案,但没有取得很大的成功。我可以并且曾经使用 Moq 进行模拟,但从来没有使用过 HttpClient
之类的东西。我应该如何解决这个问题?
最佳答案
HttpClient 的可扩展性在于传递给构造函数的HttpMessageHandler
。它的目的是允许特定于平台的实现,但您也可以模拟它。无需为 HttpClient 创建装饰器包装器。
如果您更喜欢 DSL 而不是使用 Moq,我在 GitHub/Nuget 上有一个库可以让事情变得更简单:https://github.com/richardszalay/mockhttp
Nuget Package RichardSzalay.MockHttp is available here .
var mockHttp = new MockHttpMessageHandler();
// Setup a respond for the user api (including a wildcard in the URL)
mockHttp.When("http://localost/api/user/*")
.Respond("application/json", "{'name' : 'Test McGee'}"); // Respond with JSON
// Inject the handler or client into your application code
var client = new HttpClient(mockHttp);
var response = await client.GetAsync("http://localhost/api/user/1234");
// or without async: var response = client.GetAsync("http://localhost/api/user/1234").Result;
var json = await response.Content.ReadAsStringAsync();
// No network connection required
Console.Write(json); // {'name' : 'Test McGee'}
关于c# - 在单元测试中模拟 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36425008/