2012-08-15 61 views
1

現在當構造函數創建一個響應HttpResponseMessage<T>和內容已經不存在了,如果你想測試你的控制器,你應該怎麼做? Request.CreateResponse<T>應該使用那就是像這樣的:從請求中創建HttpResponseMessage時,現在應該如何測試API控制器?

public HttpResponseMessage Post() 
{ 
    // Do Something 
    var response = Request.CreateResponse<SomeType>(System.Net.HttpStatusCode.OK, someObject); 
    return response; 
} 

現在來測試這樣我不得不存根Request對象的控制器,因爲這是在基類中的屬性和我應該使用它來創建響應,但那不是我喜歡的,並且想知道我是否可以用其他方式做到這一點?

回答

0

從我的經驗,如果你不需要修改HttpResponseMessage,避免ApiController使用它,這會讓你的代碼更簡單:

public SomeType Post() 
{ 
    // Do Something 
    return someObject; 
} 

如果它無法避免,這裏是你的答案:

ASP.NET WebApi unit testing with Request.CreateResponse

+0

我想你有最正確的答案,但我不喜歡它。如果你問我,微軟用這個API做的改變使得它的可測性降低。 – 2012-08-16 12:27:47

+0

@downvoter:關心評論? – 2012-10-25 12:23:35

0

如果不返回HttpResponseMessage那麼的WebAPI將調用MediaTypeFormatter爲你的結果寫入響應流(即它將使用MediaTypeFormatter爲你創建一個HttpResponseMessage)。許多默認實現都會執行類似於上面的操作。最簡單的解決方案是從您的函數返回SomeType,然後利用內置的MediaTypeFormatter中的一個來執行轉換。您可以單獨和一起測試兩種解決方案。

+0

我認爲你錯了,你將如何用你的方法控制http狀態碼?狀態碼不是你應該從'MediaTypeFormatter'控制的。 – 2012-08-16 12:26:30

+0

如果您擔心返回各種狀態代碼(例如201),您可以選擇將'SomeType'更改爲包裝在'Created '對象或其他物件中。你也可以選擇ActionFilter來完成這類工作。顯然每個實現是不同的,這不適用於所有... – Chris 2012-08-17 11:24:29

+0

但這是'HttpResponseMessage ',他們現在刪除的目的。做你的建議感覺就像在框架上而不是在框架上工作。 – 2012-08-17 12:16:47

相關問題