Saltar al contenido
Creación de pruebas unitarias para controladores ASP.NET MVC

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.

6min read

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:

  1. ViewData del responsable del tratamiento
  2. TempData of the Controller
  3. ViewBag del controlador
  4. 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:

  1. Índice
  2. 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:

Para crear el proyecto de prueba unitaria, haga clic con el botón derecho en la solución y agregue un nuevo proyecto

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.

Después de agregarlo, debemos agregar una referencia de System.Web.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.

 select Test->Windows->Test Explorer

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:

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.

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:

El valor devuelto de la acción Details se devuelve como ViewResult

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.

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:

  1. ViewBag pasa datos del controlador a la vista
  2. ViewData pasa datos del controlador a la vista
  3. 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.

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.

Al ejecutar la prueba, encontraremos que la prueba se ha superado y el controlador devuelve el ViewData esperado

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.

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:

  1. ViewData del responsable del tratamiento
  2. TempData of the Controller
  3. ViewBag del controlador
  4. Vista del controlador

Espero que este post os sea útil, ¡y gracias por leer!

Solicitar una demostración