2011-01-06 17 views
8

Un método de acción en mi aplicación ASP.NET MVC2 devuelve un objeto JsonResult y en mi prueba de unidad me gustaría comprobar que el objeto JSON devuelto realmente contiene los valores esperados.palabra clave "dinámica" y datos JSON

yo probamos este:

1. dynamic json = ((JsonResult)myActionResult).Data; 
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel); 

pero me da un RuntimeBinderException " 'objeto' no contiene una definición para 'ErrorLevel'".

Sin embargo, cuando coloco un punto de interrupción en la línea 2 e inspeccionar la variable dinámica JSON (ver foto abajo), es obvio que no contienen la cadena ErrorLevel y tiene el valor esperado, por lo que si el ligante no era tiempo de ejecución jugando divertido la prueba pasaría.

Snapshot of the Locals debugger window

Lo que no recibo? ¿Qué estoy haciendo mal y cómo puedo solucionarlo? ¿Cómo puedo hacer que la afirmación pase?

Respuesta

15

Realmente no necesita dinámica. Aquí hay un ejemplo. Supongamos que tenemos la siguiente acción que le gustaría a prueba de unidad:

public ActionResult Index() 
{ 
    return Json(new { Id = 5, Foo = "bar" }); 
} 

y la prueba correspondiente:

// act 
var actual = subjectUnderTest.Index(); 

// assert 
var data = new RouteValueDictionary(actual.Data); 
Assert.AreEqual(5, data["Id"]); 
Assert.AreEqual("bar", data["Foo"]); 

También usted puede encontrar el following blog post útil.

+3

it * is * working. Y aprecio cómo funciona, pero aún parece bastante pirata. Muy contra-intuitivo usar RouteValueDictionary para consultar los contenidos de un objeto anónimo ... Solo puedo recordar esta solución, ya que no creo que haya llegado a esto por mi cuenta. ¿No hay una clase diferente que haría el mismo truco con los objetos anónimos, algo que no está oculto en System.Web.dll? (Extraño, esto vive en System.Web.Routing namespace, pero NO en System.Web.Routing.dll) –

2

El Data propiedad del JsonResult es de tipo Object esto significa, a pesar de que tiene una declaración dinámica, del tipo que se establece es todavía Object. El otro problema es que está utilizando un tipo anónimo como Data y luego intenta acceder a eso como una instancia declarada fuera de su alcance aplicable. Use la técnica de @ Darin para acceder a los valores de propiedad usando RouteValueDictionary.

Cuestiones relacionadas