2013-03-04 148 views
3

關於this question我剛纔問,我再一次被我的單元測試困住了。我應該訪問單元測試的受保護方法嗎?

我目前的問題是關於測試我的抽象Component類的protected方法。

我已經成功實現了一個名爲ConcreteComponent的模擬類,它很好地繼承了抽象類的所有工作。

事情是,我做我的單元測試文件,這裏面具體的類。測試受保護方法的唯一方法是擁有一個專用訪問器。但是,我不能在單元測試所在的同一文件中創建一個專用訪問器,因此無法訪問受保護的方法。

我試圖將模擬具體類放在一個單獨的文件中,在不同的名稱空間下,現在允許我創建一個單元測試文件現在可以使用的專用訪問器。它很好地工作,但後來我覺得我需要這個模擬具體類在單元測試的同一個文件中。

所以現在我有兩個問題:

1)什麼是這個問題的可能的解決方法?

2)爲什麼我不能爲模擬類創建一個私有訪問器,它與單元測試類在同一個文件和名稱空間內?

+0

「爲什麼你不能」是一個很好的問題。你爲什麼不能?究竟發生了什麼或阻止了你? – JRoughan 2013-03-04 11:46:31

+0

以及VS2008不會允許我,無論出於何種原因。當類與單元測試位於同一個文件中時,當我右鍵單擊模擬類的名稱時,沒有選項可以創建一個專用訪問器。但是當我把模擬類放在一個單獨的文件中時,就會出現創建一個專用訪問器的選項。 – Anthony 2013-03-04 11:48:54

+0

啊,所以它的IDE不讓你。沒有意識到你正在使用MSTEST和自動生成訪問器。在這種情況下,我會遵循下面的Saurabh的建議,並相信/確保公共接口正在執行受保護的代碼,或者如果不是,那麼爲什麼它會損壞? – JRoughan 2013-03-04 11:56:46

回答

0

受保護的功能,因爲你不希望它暴露給客戶端。但是,如果它被保護,那麼可以通過公共接口通過一些令人滿意的條件來訪問,如果它不是那麼它是一個死代碼,所以刪除它。

所以金科玉律是

1,不要試圖繞過通過使用技術(反射等)測試私有/保護的方法,嘗試單元測試私有/通過公共接口保護,順便說一句,爲什麼你正在使用VS 2008測試,爲什麼不用NUnit代替

+1

我想補充一點,重構那個功能到其他類,所以它可以被單元自己測試 – 2013-03-04 11:54:17

+0

借用;私人方法應該通過公共接口間接地進行測試,或者它們很複雜,以至於應該將它們提取到一個新的類中。 – 2013-03-04 12:08:21

+0

對於受保護的方法,您的「客戶端」可能是一個類,而不是來自基礎calss,因此可以訪問其受保護的方法。受保護的方法是對象的可使用接口的一部分。完全同意你的觀點,儘管你是在談論私人方法而不是保護方法。 – 2013-03-04 12:10:06

2

你可以看看PrivateObject這個類,在你的測試中獲得你的類的非公共API。它在內部使用反射。受保護的類的資產仍然是外部客戶的API,在這種情況下,它是一個子類或派生類。所以想要測試這樣的api是可以理解的。我不會建議爲了測試受保護的api而污染某個類來公開api。然而,因爲在你的情況下,派生類是在一個測試項目中,你實際上可以提供公共API來簡化測試並提高性能(反射速度會更慢,如果你正在運行測試,持續測試,它可能會使測試運行速度慢,這取決於測試的次數等)。

+0

+1以引用PrivateObject類。雖然評分最高的答案是好的,但我很驚訝,這還沒有上傳! – Arj 2016-01-12 14:01:39

+0

你先生,改變了我的人生! – 2016-11-18 07:47:42

相關問題