最佳答案
我正在构建一个 ASP.NET Core WebAPI,并尝试为控制器编写单元测试。我发现的大多数示例都来自旧的 WebAPI/WebAPI2平台,似乎与新的 Core 控制器没有关联。
我的控制器方法返回 IActionResults
。但是,IActionResult
对象只有一个需要控制器上下文的 ExecuteResultAsync()
方法。我正在手动实例化控制器,因此此实例中的控制器上下文为 null,这在调用 ExecuteResultAsync
时会导致异常。从本质上讲,这将我带入一条非常复杂的道路,使这些单元测试能够成功完成,这是非常混乱的。我想知道测试 API 控制器一定有更简单/更正确的方法。
此外,我的控制器不使用异步/等待,如果这有什么不同。
举个简单的例子来说明我正在努力实现的目标:
控制器方法:
[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, ????);
}