2013-07-10 117 views
18

假設我有一個類「ClassA」,它對類「ClassB」(注入到ClassA的ctr)有依賴性。我想嘲笑ClassB,以便我可以單獨測試ClassA。這兩個班都是內部的。用Moq模擬內部類進行單元測試

糾正我,如果我錯了,但它看起來像Moq只能嘲笑一個類,如果它是公開的,它有一個公共無參數構造函數,被嘲笑的方法是public virtual。我不想讓這些課程公開顯示。我是否錯過了Moq的一些東西,或者它不適合我想要做的事情?

我想我可以創建一個ClassB實現的接口(比如說「IClassB」),將它注入到ClassA中,然後模擬接口。 ClassB仍然可以是內部的(儘管我意識到接口方法必須公開)。雖然這會起作用,但我對創建大量接口感到不安,它的唯一目的是支持單元測試嘲弄。思考?

回答

45

你可以做內部可見的起訂量,加入到項目的assembly.csInternalsVisibleToAttribute,像這樣:

爲什麼"DynamicProxyGenAssembly2",而不是"Moq"?它是爲了包含動態生成的代理類型而創建的動態程序集的名稱(所有這些都由另一個庫處理,Castle的DynamicProxy)由Moq使用。因此,您將類型暴露給動態代理組合,而不是Moq本身。

但是,如果沒有可覆蓋的成員,嘲笑課程有什麼意義?你不會嘲笑任何東西,所有的調用都會使用實際的實現。你的第二個解決方案,

我想我可以創建一個ClassB實現的接口(比如說「IClassB」),將它注入到ClassA中,然後模擬接口。

是我通常會做的。它的目的遠遠超過「支持單元測試嘲諷」 - 它可以幫助您構建可靠的耦合組件,這總是值得我們爭取的。

+0

有用的知道,謝謝。不過,我現在決定讓這些課程公開(至少是那些正在測試的課程)。我想我已經試圖將所有東西都放在內部,但它只是一個桌面應用程序,所以它不像在一個給客戶的組裝/ API中那樣重要。 –

+0

非常有用的帖子,我很InternalsVisibleTo(「IntegrationTests」)不能正常工作。然後它有道理,它不是我的程序集訪問它,而是Castle的動態創建的程序集。 –