87 votes

Test unitaire des méthodes du contrôleur qui renvoient IActionResult

Je suis en train de construire une WebAPI ASP.NET Core et j'essaie d'écrire des tests unitaires pour les contrôleurs. La plupart des exemples que j'ai trouvés proviennent des anciennes plateformes WebAPI/WebAPI2 et ne semblent pas correspondre aux nouveaux contrôleurs Core.

Les méthodes de mon contrôleur renvoient IActionResults . Cependant, le IActionResult n'a qu'un ExecuteResultAsync() qui nécessite un contexte de contrôleur. Je suis en train d'instancier le contrôleur manuellement, donc le contexte du contrôleur dans cette instance est nul, ce qui provoque une exception lors de l'appel à la méthode ExecuteResultAsync . Essentiellement, cela m'amène à emprunter un chemin très compliqué pour que ces tests unitaires soient menés à bien, et c'est très désordonné. Je me demande s'il existe un moyen plus simple et plus correct de tester les contrôleurs d'API.

De plus, mes contrôleurs n'utilisent PAS async/await si cela fait une différence.

Un exemple simple de ce que j'essaie d'obtenir :

Méthode de contrôle :

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

Test unitaire :

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

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

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

1 votes

Montrer le GetOrders ce que vous retournez dans cette méthode. faites passer le résultat au type de ce que vous retournez dans la méthode et effectuez votre assert sur cela.

0voto

ZHAO Shuai Roy Points 11
public async Task CallRxData_ReturnsHttpNotFound_ForInvalidJobNum_ReturnsStoredRxOrder()
{
    var scanInController = new ScanInController(_logger, _scanInService);
    var okResult = await scanInController.CallRxData(rxOrderRequest);
    var notFoundResult = await scanInController.CallRxData(invalidRxOrderRequest);
    var okResultWithScanInCheckFalse = await scanInController.CallRxData(rxOrderRequest);
    var okResultWithEmptyAelAntiFakeDatas = await scanInController.CallRxData(rxOrderRequest);
    // Assert
    Assert.That(okResult, Is.TypeOf<OkObjectResult>());
    Assert.That(notFoundResult, Is.TypeOf<NotFoundObjectResult>());
    Assert.IsFalse(((okResultWithScanInCheckFalse as ObjectResult).Value as RxOrder).IsSecurity);`enter code here`
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X