2011-12-19 20 views
14

Un controlador en mi aplicación ASP.NET MVC rellena previamente los datos del formulario visualizados por mi vista de acuerdo con un par de reglas bastante sencillas.Pruebas unitarias Controladores MVC

Parece que esto sería una buena cosa para cubrir en mi prueba unitaria. Pero la única forma en que podría ver para verificar que los datos correctos se coloquen en el formulario, sería extraer la lógica del controlador en lo que parece una forma antinatural.

¿Alguien puede sugerir formas de abordar esto?

Todos los ejemplos que he encontrado de controladores de pruebas unitarias parecían muy triviales, como la verificación de que devolvía el tipo esperado de vista. No estoy seguro de ver el valor en eso.

Respuesta

21

Puede probar echando el objeto devuelto a la clase apropiada, en lugar de utilizar su clase base (que se devuelve por defecto)

Por ejemplo, para poner a prueba el valor por defecto AccountController que había por lo menos así:

var controller = new AccountController(); 
var result = controller.LogOn() as ViewResult; 
var model = result.Model as LogOnModel; 

Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox 

Verificando el objeto devuelto se llena con los datos correctos, no parece "natural" para mí, o qué significaba de manera diferente?

+1

Ah ... 'result.Model' parece útil. –

11

Estoy de acuerdo en que probar el tipo de vista devuelto sería algo inútil. Sin embargo, probar que la "vista" esperada fue devuelta junto con sus datos correctos sería un caso de prueba válido IMO.

Por ejemplo, aquí hay un caso de prueba de edición singular para un controlador de edición. Tenga en cuenta que este ejemplo está haciendo uso de Moq y Nunit, pero aparte de eso es bastante sencillo.

Tenga en cuenta que ese ViewResult se envía al modelo de vista esperada y las aserciones se realizan contra el contacto esperado.

prueba:

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

controlador:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
}