2011-01-06 8 views
8

ASP.NET MVC2 uygulamamdaki bir eylem yöntemi, bir JsonResult nesnesi döndürür ve birim testimde, döndürülen JSON nesnesinin gerçekten beklenen değerleri içerdiğini kontrol etmek istiyorum. "dynamic" anahtar sözcüğü ve JSON verisi

bu çalıştı:

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

Ama RuntimeBinderException " 'nesne' 'Errorlevel' tanımını içermiyor" olsun.

Ancak 2. hatta bir breakpoint ve json dinamik değişken incelemek zaman, belli ki ErrorLevel dizesini içermiyor (aşağıdaki resme bakın) ve o beklenen değere sahip çalışma zamanı bağlayıcı değildi eğer öyleyse Testin komik geçmesi geçerdi.

Snapshot of the Locals debugger window

Ne alamıyorum? Neyi yanlış yapıyorum ve bunu nasıl düzeltebilirim? İddiayı nasıl geçebilirim?

cevap

15

Gerçekten dinamiklere ihtiyacınız yok. İşte bir örnek.

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

ve ilgili testi:

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

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

Ayrıca following blog post yarayabilecek Eğer birim testini istiyorum aşağıdaki eylemi vardı varsayalım.

+3

it * çalışıyor * çalışıyor. Ve nasıl çalıştığını takdir ediyorum ama hala oldukça bir kesmek gibi görünüyor. Anonim bir nesnenin içeriğini sorgulamak için RouteValueDictionary kullanmak çok karşı sezgisel ... Ben sadece bu çözümü hatırlamak umuyor olabilir ki ben kendi başıma bununla geleceğini sanmıyorum. System.Web.dll içinde gizli olmayan bir şey, anonim nesnelerle aynı hile yapar farklı bir sınıf yok mu? (garip bu System.Web.Routing ad alanında yaşıyor, ancak System.Web.Routing.dll içinde değil) –

2

JsonResult ait Data tesis dinamik beyanı olmasına rağmen, ayarlanmış tipi hala Object olduğu, bunun anlamı tip Object taşımaktadır. Diğer bir sorun ise, Data olarak anonim bir tür kullanıyorsunuz ve sonra, ilgili kapsamı dışında bildirilen bir örnek olarak buna erişmeye çalışıyor olmanızdır. RouteValueDictionary kullanarak özellik değerlerine erişmek için @ Darin'in tekniğini kullanın.