2016-07-05 47 views
4

考慮下面的WebAPI方法內容:單元測試來驗證IEnumerable的<dynamic>

public IHttpActionResult GetDeliveryTypes() 
{ 
    return Ok(... .Select(dt => new { Id = dt.Id, Name = dt.Name })); 
} 

typeof(Id) = long 
typeof(Name) = string 

雖然單元測試,我怎麼能

  1. 斷言內容是否如我所料?例如,下面的斷言失敗

    var contentResult = response as OkNegotiatedContentResult<IEnumerable<dynamic>>; 
    Assert.IsNotNull(contentResult); 
    
  2. 減少這種IEnumerable<dynamic>結果到IEnumerable<long>這樣我就可以驗證它包含的值的預期序列?

我已經將InternalsVisibleTo屬性添加到AssemblyInfo中。

+0

至少第二點根本不會奏效,因爲你的'動態'實例實際上是'anonamouys {long,string}'類型,而不是'long'類型的,它們不是嗎? – HimBromBeere

+0

完全正確@HimBromBree。這就是爲什麼我想知道爲'OkNegotiatedContentResult'指定的類型應該是什麼。 – awj

+0

因爲你已經被'動態'卡住了,爲什麼不再使用它,並通過簡單地轉換爲'danymic'而不是'OkNegotiated ...'來製作'dynamic'類型的'response'? – HimBromBeere

回答

4

東西入手:

response.GetType().GetGenericTypeDefinition() == typeof(OkNegotiatedContentResult<>) 

你可以從這裏繼續類型的調查,如果你想要的。

2.爲第二點的解決方案是相當容易的:

dynamic response = controller.GetDeliveryTypes(); 
Assert.True(response.GetType().GetGenericTypeDefinition() == typeof(OkNegotiatedContentResult<>)); 
var content = (IEnumerable<dynamic>)response.Content; 
var ids = content.Select(i => i.Id).ToList(); 

如果測試在單獨的組件 - 添加[assembly: InternalsVisibleTo("TestAssembly")]作爲匿名類型爲內部生成的。

+1

在第2點中,IHttpActionResult沒有「Content」屬性,也沒有「dynamic」(就像你聲明的那樣)。 – awj

+0

這就是要點 - [動態](https://msdn.microsoft.com/en-us/library/dd264736.aspx)假定支持任何操作。一旦我檢查到響應是'OkNegotiatedContentResult <>'我確信它有'Content'屬性。試試吧 - 有效。 –

+1

'RuntimeBinderException:'object'不包含'Content'的定義 - 這是在第三行中引發的。 – awj