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.