单元测试使用HttpClient发出Http请求的Controller

时间:2018-04-11 17:21:58

标签: c# unit-testing

我需要为这个控制器编写单元测试(最重要的是,我被要求获得代码覆盖率)。

public class MyController : Controller
{
    public async Task<ActionResult> Index()
    {
        ViewBag.Title = "Home Page";
        var httpClient = new HttpClient();
        var json = await httpClient.GetStringAsync(ConfigurationManager.AppSettings["MyCustomAPI"]);
        var tasks = JsonConvert.DeserializeObject<List<MyObject>>(json);
        return View(tasks);
    }
}

我一直在阅读有关此事的两天的想法,但我无法绕过它。

我一直在考虑像这样注入HttpClient:

    private readonly HttpClient _httpClient;

    public TasksController(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

但是在控制器构造函数中传递HttpClient可能不是一个好主意。

然后我一直在关注使用FakeItEasy的this指南,但我无法根据我的要求调整此解决方案。

我该如何进行测试?

1 个答案:

答案 0 :(得分:2)

将您的http工作提取到一个接口中,并将该接口的实现注入您的控制器。

if ....

现在,当您进行测试时,您可以在INetworkService的测试版本中进行子操作,该版本并未实际执行任何联网的IO。另外,正如评论中所提到的,你应该共享一个HttpClient,而不是一直创建新的HttpClient,客户端可以注入到真正的INetworkedService实现中。