我需要为这个控制器编写单元测试(最重要的是,我被要求获得代码覆盖率)。
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指南,但我无法根据我的要求调整此解决方案。
我该如何进行测试?
答案 0 :(得分:2)
将您的http工作提取到一个接口中,并将该接口的实现注入您的控制器。
if ....
现在,当您进行测试时,您可以在INetworkService的测试版本中进行子操作,该版本并未实际执行任何联网的IO。另外,正如评论中所提到的,你应该共享一个HttpClient,而不是一直创建新的HttpClient,客户端可以注入到真正的INetworkedService实现中。