1. ホーム
  2. c#

[解決済み] IActionResultを返すコントローラのメソッドのユニットテスト

2023-05-29 02:56:46

質問

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, ????);
}

どのように解決するのですか?

のようなものがあると仮定して

public IActionResult GetOrders() {
    var orders = repository.All();
    return Ok(orders);
}

この場合、コントローラは OkObjectResult クラスを返します。

結果をメソッドで返しているものの型にキャストし、それに対してアサートを実行します。

[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);
}