2013-09-30 35 views
3

我正在使用Microsoft Fakes分析非常長的方法,以重新分析它並獲得對它的更好理解。我已經分離出了幾行看起來像一個很好的候選人,可以將其重新分解爲一個單獨的私有方法。我正在採取的方法不是手動修改代碼(只能使用開箱即用的重新分解),以最大限度地減少我的更改帶來的後果。這裏是一個問題: 一旦我將這些行重新分解爲一個單獨的私有方法,我想要消除與這些行相關的所有設置代碼(以及包裝它們的新私有方法),並且只是「模擬出」該呼叫通過提供默認預設答案。這聽起來像一個存根/墊片,但我們正在談論被測試的類,所以我需要該類來執行它的代碼,除了「嘲笑」的方法。在Rhino Mocks中,我會使用PartialMock來將這些調用(在將它們虛擬成第一個!!!之後)去掉,但在這種情況下,Fakes能夠幫助我嗎?謝謝。在使用Fakes時正在測試的方法中「嘲笑」調用私有方法

回答

4

如果你想覆蓋私有方法(模擬私有方法),這樣做與墊片

一些很好的讀取: http://adamprescott.net/2012/08/28/unit-testing-and-private-methods/http://adamprescott.net/2012/08/21/a-shim-ple-tutorial-with-microsoft-fakes/

的例子有一個公共的方法Read其內部調用SecretMethod這是私人...

var target = new FileReader("foo"); 
var shim = new ShimFileReader(target); 
bool calledShimMethod = false; 
shim.SecretMethod =() => 
{ 
    calledShimMethod = true; 
    return "bar"; 
}; 

target.Read(); 
1

作爲另一個答案我提到,墊片是這樣做的方式。但是,請注意,通過使用墊片,您的測試現在與公開方法的實施相關聯。在很多情況下,你無法做任何事情,特別是如果你正在測試你沒有寫的代碼。請記住,測試實現意味着當代碼更改時,測試更容易中斷。

話雖如此,你確實設法逃脫實施細節導致大量的設置,這是一個加號,所以你可以前往脆。

在我正在進行的一個項目中,我使用了很多墊片,但是像我這樣,每次需要時都應該感覺很糟糕,因爲這是一個很不錯的設計指標。避免這種情況的最好方法是戰略模式(以及一般的DI),因爲您可以依靠存根。