2016-12-22 23 views
14

ASP.NET Core WebAPIを構築中ですが、コントローラの単体テストを作成しようとしています。私が見つけたほとんどの例は、古いWebAPI/WebAPI2プラットフォームのものであり、新しいCoreコントローラとは関連していないようです。IActionResultを返すWebAPIコントローラメソッドのユニット

私のコントローラメソッドは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, ????); 
} 
+0

であなたのアサートを実行しているかの型に結果をキャスト 'GetOrders'方法を表示します。あなたはその方法で何を返していますか?その結果をあなたがそのメソッドで返すものの型にキャストし、それについてあなたの主張を実行します。 – Nkosi

答えて

20

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); 
} 
関連する問題