2014-03-18 35 views
8

我想爲我們的一些webapi調用創建一個測試,並且我無法訪問結果。在我看過的所有例子中,他們都使用了OkNegotiatedContentResult。問題在於,在我們的web api調用中,我們經常會將數據包裝在匿名對象中,所以我們可以組合數據集。我可能忽略了一些明顯的東西,但我似乎無法弄清楚檢查結果信息以驗證它的正確方法。IHttpActionResult匿名對象 - 驗證結果

的WebAPI片段

var orderInfo = new 
{ 
    Customer = customerInfo, 
    Order = orderInfo 
} 

return Ok(orderInfo); 

阿比測試片段

[TestMethod] 
    public void TestGetOrderInfo() 
    { 
     var controller = new OrderController(_repo); 
     IHttpActionResult results = controller.GetOrderInfo(46); 

     Assert.IsNotNull(results); 


    } 

我如何檢查使用OkNegotiatedContentResult當匿名類型參與的結果?

+0

發現這個你永遠得到這個工作?我遇到完全相同的問題,試圖單元測試一個通過IHttpActionResult返回JSON的控制器,並且由於必須在從控制器返回之前添加一個根節點而看到一個匿名類型。我無法測試這個,因爲我無法正確使用'OkNegotiatedContentResult'。我嘗試了下面的動態方法,但沒有成功。 – Patrick

回答

10

匿名類型問題的原因是它們是內部類型而不是公共的,所以你的測試不能使用它們。

如果添加InternalsVisibleTo屬性,你的WebAPI項目然後您就能夠引用的結果,並通過動態例如它的內容:

[TestMethod] 
public void TestGetOrderInfo() 
{ 
    var controller = new OrderController(_repo); 
    dynamic results = controller.GetOrderInfo(46); 
    dynamic content = results.Content; 

    ... 

} 
+4

我有一個匿名類型和IHttpActionResult完全相同的問題。我必須添加一個根節點到我的JSON返回,所以來自Web API 2.0我正在做'return Json(new {User = person});'以獲得名爲「User」的根節點。這現在返回一個匿名類型。我試圖按照你的例子,但它'動態內容= results.Content'與'對象'失敗不包含'內容'的定義 – Patrick

2

匿名對象是內部創建它們的裝配。如果要在分離的程序集(DLL)中進行單元測試,則需要明確說明要使用InternalsVisibleTo屬性與該程序集共享內部值。