【发布时间】:2018-08-04 03:56:11
【问题描述】:
所以我有一个控制器,它使用 HttpClient 来调用 web 服务,如下所示:
public class DemoController : Controller
{
HttpClient client;
string baseUrl = "http://localhost:90/webservice";
public DemoController()
{
client = new HttpClient
{
BaseAddress = new Uri(baseUrl)
};
}
// GET: DemoInfo
public async Task<ActionResult> Index()
{
HttpResponseMessage response = await client.GetAsync(baseUrl + "vehicle/menu/year");
string content = "";
MenuItems result = null;
if (response.IsSuccessStatusCode)
{
content = await response.Content.ReadAsStringAsync();
result = (MenuItems)new XmlSerializer(typeof(MenuItems)).Deserialize(new StringReader(content));
}
return View("Index", result);
}
}
我对这个动作的单元测试如下:
[TestMethod]
public async Task Test_Index()
{
// Arrange
DemoController controller = new DemoController();
// Act
var result = await controller.Index();
ViewResult viewResult = (ViewResult) result;
// Assert
Assert.AreEqual("Index", viewResult.ViewName);
Assert.IsNotNull(viewResult.Model);
}
所以显然我想避免每次运行测试时都调用 Web 服务。在选择像 Unity 这样的 IoC 容器以便将 HttpClient 注入控制器时,我会走上正确的道路吗?这对我想要达到的目标来说是不是有点矫枉过正?我知道有很多历史,人们通过github issue 在单元测试中正确地模拟 httpclient。非常感谢任何帮助,让您深入了解如何编写控制器以在仍可测试的同时进行服务调用。
【问题讨论】:
标签: c# .net asp.net-mvc unit-testing dotnet-httpclient