2012-02-08 37 views
2

在我的控制器的動作我做:如何模擬一個沒有接口的方法?

string a = Url.Action(...); 

我使用NUnit和起訂量(和MVC 2)

我怎麼能存根調用Url.Action返回一些字符串?

+0

你可以發佈Url的定義,也許是一個更完整的示例...我們需要知道Url.Action是什麼。 – 2012-02-08 22:36:21

+0

我不認爲你可以,不能以某種方式掛鉤到Url類。 – Arafangion 2012-02-08 22:37:04

回答

2

你不能模擬沒有默認構造函數與Moq的具體類(我假設Url是UrlHelper的實例)。你這裏有兩種選擇:

(1)檢查出Moles作爲替代/輔助模擬框架

(2)寫出UrlHelper方法的包裝類,它實現一個接口,那麼你可以嘲笑爲客戶包裝。

+0

我很驚訝Moles存在 - 但它肯定不能「繞道」100%可靠性的靜態方法?例如,編譯器是否可以自由內聯靜態方法? – Arafangion 2012-02-08 22:43:54

+0

我不完全確定Moles是如何在引擎蓋下工作的,但我經常使用它,並且沒有「模仿」靜態方法或其他「unmockable」依賴的問題。 – 2012-02-08 22:46:11

+0

Controller.Url和UrlHeler.Action都不是靜態的。兩者都是該類的實例成員。然而,這也無濟於事,因爲UrlHeler.Action不是虛擬的。 – 2012-02-09 08:36:51

0

你不能。 UrlHeler.Action不是虛擬的,所以你不能用Moq存根。

但是,您可以在您的控制器中創建虛擬方法。並在測試中替換/覆蓋它的實現。

相關問題