Creación de pruebas unitarias para controladores ASP.NET MVC
En esta publicación de blog, aprenderemos a escribir pruebas unitarias para varios comportamientos del controlador MVC, como los tipos de retorno de la vista, el redireccionamiento a diferentes acciones, etc.
En esta publicación de blog, aprenderemos a escribir pruebas unitarias para varios comportamientos del controlador MVC, como los tipos de retorno de la vista, el redireccionamiento a diferentes acciones, etc. En concreto, hablaremos de la escritura de pruebas unitarias para:
- ViewData del responsable del tratamiento
- TempData of the Controller
- ViewBag del controlador
- Vista del controlador
Let’s get started!
Creación del proyecto MVC bajo prueba
Sigamos adelante y creemos un proyecto MVC en Prueba. Para simplificar las cosas, he seleccionado "Sin autenticación" para el proyecto. En este ejemplo vamos a escribir pruebas unitarias para el HomeController. HomeController contiene dos métodos de acción:
- Índice
- Detalles
Vamos a escribir pruebas para estas acciones. El HomeController contiene el código que se muestra aquí:
public class HomeController : Controller {
public ActionResult Index() {
return View("Index");
}
public ActionResult Details(string Id) {
//logic to fetch details on ID
return View("Details");
}
}
Creación del proyecto de prueba
Para crear el proyecto de prueba unitaria, haga clic con el botón derecho en la solución y agregue un nuevo proyecto. En el cuadro de diálogo Agregar nuevo proyecto, seleccione Plantilla de proyecto de prueba unitaria en la pestaña Prueba, como se muestra en la imagen siguiente:

También puede crear un proyecto de prueba mientras crea el proyecto MVC, seleccionando la casilla de verificación para agregar proyecto de prueba. Una vez creado el proyecto de prueba, haga clic con el botón derecho en el proyecto y agregue una referencia al proyecto MVC. Después de agregarlo, debemos agregar una referencia de System.Web.Mvc en el proyecto de prueba haciendo clic con el botón derecho en el proyecto de prueba y seleccionando Administrar paquete Nuget. Desde el Administrador de paquetes Nuget, puede instalar Microsoft.AspNet.Mvc en el proyecto de prueba.

Como último paso para configurar el proyecto de prueba, haga clic con el botón derecho y agregue una clase denominada HomeControllerTest. En la clase recién creada, escriba un método de prueba de ejemplo como se muestra en la lista a continuación.
public class HomeControllerTest {
[TestMethod] public void SampleTest() {
Assert.AreEqual("HomeController", "HomeController");
}
}
Ahora está listo para compilar el proyecto de prueba y no debería obtener ningún error de compilación. Hemos escrito el método de prueba de ejemplo comparando dos cadenas, y para ejecutar la prueba, simplemente seleccione Test->Windows->Test Explorer como se muestra en la imagen a continuación.

En el Explorador de pruebas, encontrará SampleTest en la lista. Para ejecutar la prueba, haga clic con el botón derecho en la prueba y seleccione ejecutar, o haga clic en Ejecutar a la derecha en la parte superior de la prueba. En este ejemplo, ejecutamos SampleTest, ¡que se pasa! Puede ver las pruebas superadas en el Explorador de pruebas, como se muestra en la imagen siguiente:

Ahora sigamos adelante y comencemos a escribir pruebas para los comportamientos de HomeController.
Vista de prueba devuelta por el controlador
Escribamos test para verificar si la vista esperada es devuelta por el método de acción del controlador o no, y comencemos escribiendo una prueba que fallará:
[TestMethod]
public void ReturnsDetailsView() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("fooview", result.ViewName);
}
Como puede ver en la prueba anterior, estamos llamando a la acción Details en el objeto de HomeController. El valor devuelto de la acción Details se devuelve como ViewResult. En la última línea, estamos afirmando si el nombre de la vista reajustada es igual a fooview o no. Al ejecutar la prueba, obtendremos el error como se muestra a continuación:

Como se encuentra claramente en el mensaje de error, el nombre real de la vista es Detalles. Así que regresemos y escribamos la prueba para aprobar. Para que la prueba se supere, cambiamos el nombre de vista esperado a Detalles.
[TestMethod]
public void ReturnsDetailsView() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("Details", result.ViewName);
}
Al correr por encima de la prueba pasaría.

Prueba de la ViewBag devuelta por el Controller
ViewBag, ViewData y TempData son objetos que pasan datos de un controlador a otro controlador o del controlador a la vista de la siguiente manera:
- ViewBag pasa datos del controlador a la vista
- ViewData pasa datos del controlador a la vista
- TempData pasa los datos a la solicitud HTTP posterior.
En el controlador, ViewBag se puede configurar como se muestra en la lista a continuación:
public ActionResult Details(string Id) {
ViewBag.Name="foo";
//logic to fetch details on ID
return View("Details");
}
En la acción Detalles, estamos creando una propiedad Name para ViewBag y estableciendo su valor en string foo. La prueba unitaria para probar ViewBag se puede escribir como se muestra en la lista a continuación:
public void ReturnsViewBag() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.ViewData["Name"]);
}
Simplemente, estamos creando el objeto del controlador y luego llamando a la acción. Encasillar el valor devuelto como ViewResult y, a continuación, afirmar el resultado. Al ejecutar la prueba, encontraremos que ha pasado y el controlador está devolviendo el ViewBag esperado.

Probar los ViewData devueltos por el controlador
En el controlador, ViewData se puede configurar como se muestra en la siguiente lista:
public ActionResult Details(string Id) {
ViewData["Name"]="foo";
//logic to fetch details on ID
return View("Details");
}
En la acción Detalles, estamos creando un ViewData y estableciendo su valor en string foo. La prueba unitaria para probar ViewData se puede escribir como se muestra en la lista a continuación:
public void ReturnsViewData() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.ViewData["Name"]);
}
Simplemente, estamos creando un objeto del controlador y luego llamando a la acción. Encasillar el valor devuelto como ViewResult y, a continuación, afirmar el resultado. Al ejecutar la prueba, encontraremos que la prueba se ha superado y el controlador devuelve los ViewData esperados.

Prueba de los TempData devueltos por el controlador
TempData se usa para pasar datos a la siguiente solicitud HTTP. En palabras más simples, podemos pasar datos de un controlador/acción a otro controlador/acción usando TempData. Se puede configurar como se muestra en el listado a continuación:
public ActionResult Details(string Id) {
TempData["Name"]="foo";
//logic to fetch details on ID
return RedirectToAction("Index");
}
En la acción Detalles, creamos un TempData y establecemos su valor en string foo y redirigimos a la acción Index. La prueba unitaria para probar TempData se puede escribir como se muestra a continuación:
[TestMethod] public void ReturnsTempData() {
HomeController controllerUnderTest=new HomeController();
var result=controllerUnderTest.Details("a1") as ViewResult;
Assert.AreEqual("foo", result.TempData["Name"]);
}
Aquí, estamos creando un objeto del controlador y luego llamando a la acción. encasillando el valor devuelto como ViewResult y, a continuación, afirmando el resultado. Al ejecutar la prueba, encontraremos que la prueba se ha superado y el controlador devuelve el TempData esperado.

Resumen
Siempre es una buena práctica escribir pruebas unitarias para varios objetos del controlador. En este post, aprendimos a escribir Pruebas Unitarias para:
- ViewData del responsable del tratamiento
- TempData of the Controller
- ViewBag del controlador
- Vista del controlador
Espero que este post os sea útil, ¡y gracias por leer!