c# - 在单元测试中模拟 HttpClient

标签 c# unit-testing moq

我在尝试包装我的代码以便在单元测试中使用时遇到了一些问题。问题是这样的。我有接口(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/

相关文章:

c# - 最小起订量从带参数的方法返回新对象

unit-testing - 如何使用 StructureMap 依赖注入(inject)在 Web API 测试中模拟 AutoMapper IMapper 对象?

c# - Moq 和 nUnit 测试 Entity Framework MVC 3 C#

c# - MVC Web API post 方法接收到 MailMessage 对象为空

c# - 如何在 C# 中一次跳出多个循环?

unit-testing - 在编写源代码之前如何编写单元测试?

c# - 如何在 ASP.NET MVC 中对私有(private) Controller 方法进行单元测试?

c# - EntityFramework 6 如何通过反射获取身份字段?

c# - 计算字符串中零的个数

java - 是否存在允许一定比例的失败的测试框架?