我正在构建一个ASP.NET Core WebAPI,并尝试为控制器编写单元测试。我找到的大多数示例来自旧的WebAPI/WebAPI2平台,似乎与新的Core控制器不相符。
我的控制器方法返回 IActionResults
。然而,IActionResult
对象只有一个 ExecuteResultAsync()
方法,需要一个控制器上下文。我手动实例化了控制器,所以在这种情况下控制器上下文是 null,调用 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
方法。你在该方法中返回什么?将结果转换为方法返回的类型并在其上执行assert。 - Nkosi