2012-12-20 28 views
12

我有一個返回如何讀取匿名類型的屬性?

return new System.Web.Mvc.JsonResult() 
{      
    Data = new 
    { 
     Status = "OK", 
    } 
} 

我需要編寫一個單元測試,其中我需要驗證jsonResult.Data.status= "OK"的方法。

如何讀取狀態屬性?

更新: 我試過[程序集:InternalsVisibleTo(「TestingAssemblyName」)],但沒有幫助。我不斷收到錯誤{「'System.Web.Mvc.JsonResult'不包含'狀態'的定義。」}

除了我想我不想修改我測試的代碼。

所以我採取了喬恩的建議和反思。

 var type = jsonResult.Data.GetType(); 

     var pinfo = type.GetProperty("Status"); 

     string statusValue = pinfo.GetValue(jsonResult.Data,null).ToString(); 

     Assert.AreEqual("OK", statusValue); 
+0

在MS單元測試或JavaScript? –

+0

如果你是從C#開始做這件事的話,你可以使用'dynamic'並讓動態綁定器來處理它。 – vcsjones

+0

gallio單元測試。我正在嘗試的是Assert.AreEqual(「OK」,jsonResult.Data.Status) – developer747

回答

17

最簡單的方法可能是使用動態類型:

dynamic foo = ret.Data; 
Assert.AreEqual("OK", foo.status); 

請注意,你需要爲了使用[InternalsVisibleTo]給匿名類型的單元測試組件訪問您的生產組裝,因爲它將與internal訪問一起生成。

或者,只需使用反射。

6

dynamic

dynamic testObject = YourMethodThatReturnsDynamicObject().Data; 
Assert.AreEqual("OK", testObject.Status); 
+1

預期值應該是AreEqual的第一個參數,實際值應該是第二個。 –

+0

@JonSkeet ..你去了,雖然我打字的時候我只是沒有想到(有時intellisense會走很長的路!)。 –

+0

@ AnonymousVoter:我讚賞同情投票..當你和喬恩同時回覆時,很難得到任何答案! :) –