2011-01-11 4 views
15

decir que tengo una vista con el siguiente código en la parte superior de la página:¿Hay alguna forma de probar las propiedades ASP.NET MVC ViewBag establecidas en la vista?

@{ 
    ViewBag.Title = "About Us"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

Y tengo un método de control:

public ActionResult About() 
    { 
     return View(); 
    } 

¿Cómo puedo probar que el ViewBag se fijaron apropiadamente?

He intentado el siguiente código.

[TestCase] 
public void About() 
{ 
    var controller = new AboutController(); 
    var ar = controller.About() as ViewResult; 
    Assert.AreEqual("About Us", ar.ViewBag.Title); 
} 

pero me da el siguiente resultado cuando corro la prueba:

Tests.Controllers.AboutControllerTests.About(): 
    Expected: "About Us" 
    But was: null 

Respuesta

4

No, no se puede probar vistas como esta. Lo más parecido que puede obtener es convertir la vista en un escritor de flujo y luego probar el código HTML generado. No es algo que comúnmente se hace en pruebas unitarias. Le recomendaría realizar pruebas web para verificar que las vistas sean correctas. Puede crear pruebas web con Visual Studio o también existe el marco Selenium gratuito.

+0

También uso el enfoque del escritor/lector de secuencias sugerido por @Darin. – neontapir

+0

Cualquiera que vea esto y se dé por vencido al resolver el problema, desplácese a la respuesta de @ phil.wheeler, ¡me ayudó! 'ViewData [yourKey]' o 'ViewData [" Title "]' NB, esto funciona si configura el valor 'Viewbag.Title' en el controlador, no en el' cshtml' –

+0

Se puede probar. Por favor, elija la respuesta correcta – MJK

6

El ViewResult devuelto por un controlador solo tiene una referencia a la vista que debe mostrarse. La vista ni siquiera está resuelta en este momento. El código allí nunca se ejecuta con tu prueba.

Lo que debe hacer es establecer las propiedades de ViewBag en el controlador, no en la vista. Por lo general, la vista solo leerá dichos valores.

creo que sirve

50

Dado que tanto el ViewData y ViewBag utilizan el mismo patrón de almacenamiento, debe ser capaz de utilizar ViewData[yourKey] en sus pruebas.

Así que la prueba se verá así:

[TestCase] 
public void About() 
{ 
    var controller = new AboutController(); 
    var ar = controller.About() as ViewResult; 
    Assert.AreEqual("About Us", ar.ViewData["Title"]); 
} 
+0

Esta es la respuesta. –

+0

Este método parece funcionar, pero solo si está configurando valores 'ViewBag' en el controlador –

16

Ha intentado

Assert.AreEqual("About Us", controller.ViewBag.Title); 

Funciona para mí

+0

Funciona, pero ¿es esa la manera correcta de afirmar que la vista lo tiene? – DevDave

+0

No, no es ... si la vista arroja un error al cargar, no lo sabrías simplemente probando el título del controlador. – levininja

2

Por lo que su valor, he encontrado que la siguiente funcionó bien:

Assert.AreEqual(_layout, result.ViewBag.Layout); 

Con result siendo el ViewResult

Cuestiones relacionadas