Estoy intentando probar la acción Index
de un controlador. La acción utiliza AutoMapper para asignar un objeto de dominio Customer
a un modelo de vista TestCustomerForm
. Mientras esto funciona, me preocupa la mejor manera de probar los resultados que recibo de la acción Index
.Después de usar Automapper para mapear un ViewModel ¿cómo y qué debo probar?
acción index del controlador se parece a esto:
public ActionResult Index()
{
TestCustomerForm cust = Mapper.Map<Customer,
TestCustomerForm>(_repository.GetCustomerByLogin(CurrentUserLoginName));
return View(cust);
}
Y su TestMethod
se parece a esto:
[TestMethod]
public void IndexShouldReturnCustomerWithMachines()
{
// arrange
var customer = SetupCustomerForRepository(); // gets a boiler plate customer
var testController = CreateTestController();
// act
ViewResult result = testController.Index() as ViewResult;
// assert
Assert.AreEqual(customer.MachineList.Count(),
(result.ViewData.Model as TestCustomerForm).MachineList.Count());
}
En el método CreateTestController
utilizo Rhino.Mocks
para burlarse de un repositorio del cliente y configurarlo para devolver al cliente al SetupCustomerForRepository
. De esta manera, sé que el repositorio devolverá al cliente previsto cuando la acción Index
llame al _repository.GetCustomerByLogin(CurrentUserLoginName)
. Por lo tanto, creo que afirmar que un recuento igual es adecuado para satisfacer IndexShouldReturnCustomerWithMachines
.
Todo lo dicho, me preocupa lo que debería probar.
- Parece presuntuoso lanzar el
result.ViewData.Model as TestCustomerForm
. ¿Es esto realmente un problema? Esto me preocupa porque en este caso, realmente no estoy haciendo un desarrollo basado en pruebas y parece que estoy contando con una implementación particular para satisfacer la prueba. - ¿Existen pruebas más adecuadas para garantizar una asignación correcta?
- ¿Debo estar probando cada propiedad mapeada del
TestCustomerForm
? - ¿Hay más pruebas generales de acción del controlador que debería hacer?
Gran respuesta que tiene mucho sentido. Para la posteridad, ¿te importaría agregar tu declaración de prueba? – ahsteele
¿Cómo funcionaría esto con el nuevo WebApi, donde mi método Get devuelve un IEnumerable y no un resultado de acción? –
shashi
@sassyboy Tiendo a usar una capa de servicio aislada con API web, donde puedes crear una abstracción similar tuya. –