2010-12-06 25 views
2

如果我用一個自定義的ActionMethodSelectorAttribute來修飾一個控制器動作,那麼這個屬性會在標準使用期間被評估,並且我可以在調試會話期間中斷屬性的主體。但是,在單元測試期間調用控制器操作時,不會評估/評估該屬性,也不會在調試期間中斷該屬性。爲什麼是這樣?無論正常運行還是正在測試,行爲都應該是相同的?爲什麼在MVC的單元測試期間沒有自定義ActionMethodSelectorAttribute?

由於

回答

4

這是負責運行動作過濾器的ASP.NET MVC框架。在內部,它使用反射檢查控制器和操作方法,如果方法或控制器使用任何ActionFilter屬性進行修飾,它將在請求生命週期中的適當位置運行這些過濾器。

對於單元測試,您需要單獨測試您的動作過濾器 - 直接將模擬的ActionExecutedContext(或您要過濾的任何上下文)注入過濾器方法,並驗證route/result/viewdata是根據需要修改。

如果您確實承諾使用100%的測試覆蓋率,還可以實施將使用反射的單元測試,以驗證您是否擁有裝飾相應控制器方法的必需操作過濾器屬性。

不要擔心測試以確保操作過濾器被觸發 - 這些測試是ASP.NET MVC源代碼的一部分,上次我查看時,它們都是綠色的。

+0

謝謝,非常明確的解釋。 – flesh 2010-12-07 01:21:55

0

屬性將由MVC框架的某些部分由反射在所述控制器和調用所需的方法(或多個)被調用。如果你的測試看起來像這樣:

Controller testController = new YourController(dependecies); 
ActionResult result = testController.Action(); 

//assert on result 

然後沒有什麼會處理該屬性,所以你的斷點不會被打。

相關問題