我正在构建一个 ASP.NET Core WebAPI,我正在尝试为 Controller 编写单元测试。我发现的大多数示例都来自较旧的 WebAPI/WebAPI2 平台,似乎与新的核心 Controller 无关。
我的 Controller 方法正在返回 IActionResults
。但是,IActionResult
对象只有一个需要 Controller 上下文的 ExecuteResultAsync()
方法。我正在手动实例化 Controller ,因此此实例中的 Controller 上下文为空,这会在调用 ExecuteResultAsync
时导致异常。从本质上讲,这使我走上了一条非常棘手的道路,以使这些单元测试成功完成并且非常困惑。我想知道必须有一种更简单/正确的方法来测试 API Controller 。
此外,我的 Controller 不会使用 async/await,如果这会有所不同的话。
我要实现的目标的简单示例:
Controller 方法:
[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, ????);
}
最佳答案
假设类似
public IActionResult GetOrders() {
var orders = repository.All();
return Ok(orders);
}
本例中的 Controller 返回一个 OkObjectResult
类(class)。
将结果转换为您在方法中返回的类型并对其执行断言
[Fact]
public void GetOrders_WithOrdersInRepo_ReturnsOk() {
// arrange
var controller = new OrdersController(new MockRepository());
// act
var result = controller.GetOrders();
var okResult = result as OkObjectResult;
// assert
Assert.IsNotNull(okResult);
Assert.AreEqual(200, okResult.StatusCode);
}
关于c# - 返回 IActionResult 的单元测试 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41292919/