2016-12-22 15 views
14

Jestem w trakcie budowania interfejsu ASP.NET Core WebAPI i próbuję zapisać testy jednostkowe dla kontrolerów. Większość przykładów, które znalazłem, pochodzi ze starszych platform WebAPI/WebAPI2 i nie wydaje się, aby korelowały one z nowymi kontrolerami Core.Testowanie jednostki Metody kontrolera WebAPI, które zwracają IActionResult

Moje metody sterowania zwracają IActionResults. Jednak obiekt IActionResult ma tylko metodę ExecuteResultAsync(), która wymaga kontekstu kontrolera. Instancji kontrolera jestem ręcznie, więc kontekst kontrolera w tym wystąpieniu jest null, co powoduje wyjątek podczas wywoływania ExecuteResultAsync. Zasadniczo prowadzi to mnie do bardzo zjadliwej ścieżki, aby pomyślnie ukończyć te testy jednostkowe i jest bardzo niechlujna. Zastanawiam się, że musi istnieć prostszy/poprawniejszy sposób testowania kontrolerów API.

Ponadto, moje kontrolery NIE używają async/czekam, jeśli to robi różnicę.

Prostym przykładem co usiłuję osiągnąć:

metodę

Kontroler:

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

jednostka testowa:

[Fact] 
public void GetOrders_WithOrdersInRepo_ReturnsOk() 
{ 
    // arrange 
    var controller = new OrdersController(new MockRepository()); 

    // act 
    IActionResult result = controller.GetOrders(); 

    // assert 
    Assert.Equal(HttpStatusCode.OK, ????); 
} 
+0

Pokaż 'metody GetOrders'. co powracasz w tej metodzie. rzuć wynik do rodzaju tego, co powracasz w metodzie i wykonaj swój dowód na ten temat. – Nkosi

Odpowiedz

20

Zakładając coś jak

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

controll er w tym przypadku zwraca klasę OkObjectResult.

Obsada wynik z typem co wracają w sposobie i wykonywać swoją dochodzić na tym

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