c# - 返回 IActionResult 的单元测试 Controller 方法

标签 c# unit-testing asp.net-core .net-core asp.net-core-webapi

我正在构建一个 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/

相关文章:

c# - 像这样处理特定异常是否可以

c# - 托管堆 .Net 4.5 中的未知对象

c# - 登录以使用 Live SDK、Windows 应用商店应用

python - 确定 Python 项目中的速度覆盖范围

unit-testing - 在 TFS 2015 上运行的单元测试中,App.Config 不提供连接字符串

authentication - 使用 Google OAuth 保护 ASPNET 核心中的 Web 服务

c# - RedirectStandardOutput 和批处理文件中的暂停命令

spring - 非法状态异常 : must not be null of Spock unit test with Kotlin business logic

asp.net-core - 什么可能导致 `UserManager` 返回错误的用户?

asp.net-core - 填充 AspNetUserLogins 和 AspNetUserTokens