2012-07-15 11 views
13

¿Existe alguna manera fácil de verificar en una prueba unitaria que una acción del controlador efectivamente está redirigiendo a una página específica?Verificar la redirección con prueba unitaria en asp.net mvc

código de controlador:

public ActionResult Create(ProductModel newProduct) 
{ 
    this.repository.CreateProduct(newProduct); 
    return RedirectToAction("Index"); 
} 

Así que en mi prueba, que tendría que verificar que el controlador está redirigiendo realidad.

ProductController controller = new ProductController(repository); 

RedirectToRouteResult result = (RedirectToRouteResult)controller.Create(newProduct); 

bool redirected = checkGoesHere; 
Assert.True(redirected, "Should have redirected to 'Index'"); 

No estoy seguro de cómo hacer la verificación. ¿Algunas ideas?

Respuesta

25

Claro:

Assert.AreEqual("Index", result.RouteValues["action"]); 
Assert.IsNull(result.RouteValues["controller"]); // means we redirected to the same controller 

y el uso de MvcContrib.TestHelper se podría escribir esta prueba unitaria de una manera mucho más elegante (que ni siquiera necesita para echar a un RedirectToRouteResult):

// arrange 
var sut = new ProductController(repository); 

// act 
var result = sut.Create(newProduct); 

// assert 
result 
    .AssertActionRedirect() 
    .ToAction("Index"); 
+0

Gracias Darin - sabía que iba a ser algo tan simple como este. –

+0

+1 para el enlace a TestHelper –

+0

¡Esta biblioteca MvcContrib es fantástica! – will

11

Try esto ...

var result = sut.Create(newProduct) as RedirectToRouteResult; 
Assert.Equal(result.RouteValues["action"], "Index"); 

Y si está pasando un parámetro en la redirección yo u puede hacer algo como esto ...

var result = sut.Create(newProduct) as RedirectToRouteResult; 
Assert.Equal(result.RouteValues["action"], "Index"); 
Assert.Equal(result.RouteValues["Parameter Name"], "Parameter Value"); 

Espero que esto ayude :)

Cuestiones relacionadas