vs2015 visual unitarias studio pruebas mvc mock las interfaz funcionan con como automatizadas c# unit-testing asp.net-core

c# - visual - Métodos de controlador de pruebas unitarias que devuelven IActionResult



pruebas unitarias visual studio c# (1)

Estoy en el proceso de construir un ASP.NET Core WebAPI y estoy intentando escribir pruebas unitarias para los controladores. La mayoría de los ejemplos que he encontrado son de las plataformas WebAPI / WebAPI2 anteriores y no parecen estar en correlación con los nuevos controladores Core.

Mis métodos de controlador están devolviendo IActionResults . Sin embargo, el objeto IActionResult solo tiene un método ExecuteResultAsync() que requiere un contexto de controlador. Estoy creando una instancia del controlador manualmente, por lo que el contexto del controlador en esta instancia es nulo, lo que provoca una excepción al llamar a ExecuteResultAsync . Esencialmente, esto me está llevando por un camino muy difícil para que estas pruebas de unidades se completen con éxito y son muy desordenadas. Me pregunto si debe haber una manera más simple / correcta de probar los controladores API.

Además, mis controladores NO están usando async / await si eso hace una diferencia.

Ejemplo simple de lo que estoy tratando de lograr:

Método del controlador:

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

Prueba de unidad:

[Fact] public void GetOrders_WithOrdersInRepo_ReturnsOk() { // arrange var controller = new OrdersController(new MockRepository()); // act IActionResult result = controller.GetOrders(); // assert Assert.Equal(HttpStatusCode.OK, ????); }


Asumiendo algo como el

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

el controlador en este caso está devolviendo una clase OkObjectResult .

Transmita el resultado al tipo de lo que está devolviendo en el método y realice su aseveración en eso

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