2010-09-27 75 views
2

如何聲明在System.RuntimeType中包裝了預期類型?斷言MVC控制器的返回類型操作

作爲一個更大的單元測試的一部分,以驗證一個動作是否有正確的參數和動作過濾器分配我聲稱對一個填充的MethodInfo實例。當我聲稱違反「action.ReturnParameter」它會失敗,因爲它說類型是System.RunTimeType。雖然我明白這是圍繞預期類型的​​包裝,但我似乎無法找到一種方式來斷言包裝的實例是預期的類型 - 迄今爲止我提出的最好方法是聲明反對名字或全名,但這很糟糕,因爲它只是使用「魔術弦」。

任何人都可以幫忙嗎?由於我的谷歌搜索沒有發現任何有用的東西,我猜這是一個非常簡單的解決方案,我只是沒有看到它。

的代碼如下:

[TestMethod] 
public void CheckActionFilterSet() 
{ 
    MethodInfo action = new CustomerController((new MockHttpContext()).Object) 
           .GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance) 
           .Where(mi => mi.Name.Equals("Search")).First(); 
    Assert.That(action.ReturnParameter.ParameterType, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 
} 

異常消息是:

查看結果應該是預期類型的​​

預期:

<的System.Web的實例.Mvc.ViewResult >

卻被:

<System.RuntimeType>

回答

3

只要打電話給控制器方法,並檢查返回的對象的類型:

var result = new CustomerController((new MockHttpContext()).Object).Search(....); 

Assert.That(result, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 

您還可以檢查值的ViewData /模型,如果你想...

+0

是的,這將是我曾經這樣做的方式。我只是希望有一種方法可以將它從methodInfo的已填充實例上去掉,因爲它似乎在該測試中表現得更好。然後,我不必擔心在測試通話本身的功能時檢查返回類型。 – 2010-09-27 14:52:53

+1

但是,您不能靜態檢查運行時返回的對象的類型。你只檢查方法聲明的返回類型。例如,返回類型爲ActionResult的方法在用戶未登錄時可能會返回一個視圖(ViewResult)或一個RedirectToRouteResult實例。您的測試應該測試這個。 – 2010-09-27 15:09:33

+0

當然,這很有道理。謝謝 – 2010-09-27 15:52:04

相關問題