MVC ASP.NET - Pruebas unitarias - Moq


Sin pretender escribir un tutorial se enumeran los pasos llevados a cabo en esta aplicación para añadir un proyecto de test unitario sobre el controlador generado en una sección anterior. Dicho controlador está preparado para pruebas unitarias, esto es, desacoplado del contexto y siendo inyectado por el contenedor de inversión de Control (IoC container) Ninject

(En el proceso se ha utilizado el mocking framework Moq)

  1. Agregamos un proyecto de tipo "Unit test Project"

  2. Añadimos a dicho proyecto una referencia al proyecto que vamos a testear.

  3. Añadimos el paquete de Nuget "Moq: an enjoyable mocking library" al nuevo proyecto de test.

  4. Añadimos una referencia a System.Web.Mvc en nuestro proyecto de test para comprobar las respuestas de tipo ViewResult del controlador.

    (aquí he tenido algun contratiempo con la versión de System.Web.Mvc que añade Kendo al proyecto MVC)

  5. Modificamos el TestMethod que viene por defecto realizando una prueba que compruebe si en un contexto ficticio (Mocking) con 3 ciudades la acción del controlador devuelve un modelo con 3 ciudades:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Moq;
    using proyectoMVC.Models;
    using proyectoMVC.ViewModels;
    using proyectoMVC.Models.Interfaces;
    using System.Collections.Generic;
    using proyectoMVC.Controllers;
    using System.Web.Mvc;
    namespace ProyectoTestControlador
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void ListaDeTodasLasPosiblesCiudades()
            {
                //Arrange
                var mockCiudadRepositorio = new Mock();
                var response = new List();
                response.Add(new Ciudades {ID = 1, NOMBRE = "Sevilla"});
                response.Add(new Ciudades { ID = 2, NOMBRE = "Madrid" });
                response.Add(new Ciudades { ID = 3, NOMBRE = "Valencia" });
                mockCiudadRepositorio.Setup(x => x.GetAllCiudades()).Returns(response);
                var CiudadesControllerX = new CiudadesController(mockCiudadRepositorio.Object);
                //Act
                var result = (ViewResult)CiudadesControllerX.DameTodasCiudades();            
                var model = (List)result.Model;
                //Assert
                Assert.AreEqual(3,model.Count,
                    "Total inesperado de Ciudades");
            }
        }
    }
                        
  6. El resultado es que el controlador funciona correctamente cuando pasamos la prueba: