【发布时间】:2017-05-08 15:44:55
【问题描述】:
我正在构建 ASP.NET Core WebAPI,并且正在尝试为控制器编写单元测试。我发现的大多数示例都来自较旧的 WebAPI/WebAPI2 平台,并且似乎与新的 Core 控制器无关。
我的控制器方法返回IActionResults。但是,IActionResult 对象只有一个需要控制器上下文的 ExecuteResultAsync() 方法。我是手动实例化控制器,所以这个实例中的控制器上下文为空,这会导致调用ExecuteResultAsync时出现异常。从本质上讲,这使我走上了一条非常糟糕的道路,以使这些单元测试成功完成并且非常混乱。我想知道必须有一种更简单/正确的方法来测试 API 控制器。
另外,我的控制器不会使用 async/await,如果这有影响的话。
我想要实现的简单示例:
控制器方法:
[HttpGet(Name = "GetOrdersRoute")]
public IActionResult GetOrders([FromQuery]int page = 0)
{
try
{
var query = _repository.GetAll().ToList();
int totalCount = query.Count;
int totalPages = (int)Math.Ceiling((double)totalCount / pageSize) - 1;
var orders = query.Skip(pageSize * page).Take(pageSize);
return Ok(new
{
TotalCount = totalCount,
TotalPages = totalPages,
Orders = orders
});
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
单元测试:
[Fact]
public void GetOrders_WithOrdersInRepo_ReturnsOk()
{
// arrange
var controller = new OrdersController(new MockRepository());
// act
IActionResult result = controller.GetOrders();
// assert
Assert.Equal(HttpStatusCode.OK, ????);
}
【问题讨论】:
-
显示
GetOrders方法。你在那个方法中返回什么。将结果转换为您在方法中返回的类型并对其执行断言。
标签: c# unit-testing asp.net-core .net-core asp.net-core-webapi