2011-01-06 18 views
8

Metoda działania w mojej aplikacji ASP.NET MVC2 zwraca obiekt JsonResult iw moim teście jednostki chciałbym sprawdzić, czy zwracany obiekt JSON rzeczywiście zawiera oczekiwane wartości."dynamiczne" słowo kluczowe i dane JSON

Próbowałem to:

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

Ale dostaję RuntimeBinderException " 'obiekt' nie zawierają definicji dla 'errorlevel'".

Jednak, kiedy umieścić punkt przerwania na linii 2 i sprawdzić zmienną dynamiczną json (patrz zdjęcie poniżej), to oczywiście ma zawierać ciąg errorlevel i ma wartość oczekiwaną, więc jeśli nie było spoiwo wykonawcze grając zabawnie test przejdzie.

Snapshot of the Locals debugger window

Co ja nie dostanę? Co robię źle i jak mogę to naprawić? Jak mogę przekazać asercję?

Odpowiedz

15

Nie potrzebujesz dynamicznej. Oto przykład. Załóżmy, że następujące działania, które chciałbyś test Jednostka:

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

i odpowiedniego testu:

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

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

Również można znaleźć following blog post użyteczne.

+3

it * to * działa. I doceniam, jak to działa, ale wciąż wygląda na całkiem hack. Bardzo sprzeczne z intuicją używanie RouteValueDictionary do sprawdzania zawartości anonimowego obiektu ... Mogę tylko mieć nadzieję na zapamiętanie tego rozwiązania, ponieważ nie sądzę, że sam bym to wymyślił. Czy nie istnieje inna klasa, która zrobiłaby tę samą sztuczkę z anonimowymi obiektami, coś nie ukrytego w System.Web.dll? (Dziwne, że to żyje w Przestrzeni nazw System.Web.Routing, ale NIE w System.Web.Routing.dll) –

2

Majątek JsonResultData jest typu Object Oznacza to, że chociaż masz dynamiczny deklarację, typ, który jest ustawiony jest nadal Object. Inną kwestią jest to, że używasz anonimowego typu jako Data, a następnie próbujesz uzyskać do niego dostęp, jako zadeklarowaną instancję poza zakresem jej zastosowania. Użyj techniki @ Darin do uzyskania dostępu do wartości właściwości za pomocą RouteValueDictionary.

Powiązane problemy