我已經開始重構我的代碼以使其可測試。我發現問題的一個領域是將對象構造和應用程序邏輯混合在一起。如果我有一個名爲SomeClass
構造函數執行應用邏輯也實例化另一個I類運行中的問題時,我嘗試測試:將對象構造與應用程序邏輯混合
function SomeClass() {
//does lots of application type work
//but then also instantiates a different object
new AnotherClass();
}
測試變得困難,因爲現在我需要找到一種方法來創建在AnotherClass
測試環境。
我已經處理了使用依賴注入的這個問題。所以SomeClass
需要的AnotherClass
實例作爲參數:
function SomeClass(anotherObj) {
}
問題的,這是因爲據我可以看到的是這一切都爲推遲問題在我的應用程序別的地方。我仍然需要在我的代碼中的其他地方從AnotherClass
創建anotherObj
。
這谷歌測試文章http://googletesting.blogspot.co.uk/2008/08/by-miko-hevery-so-you-decided-to.html建議:
爲了有一個可測試的代碼庫您的應用程序應該有兩個 種類別。這些工廠都有「新」運營商 ,它們負責構建應用程序的對象圖, ,但不做任何事情。而且應用程序邏輯類沒有「新」運算符並負責做工作。
這聽起來完全像我的問題,工廠類型模式是我所需要的。所以,我想是這樣的:
function anotherClassFactory() {
return new AnotherClass();
}
function SomeClass() {
anotherClassFactory();
}
但隨後SomeClass
還是對工廠的依賴。我如何正確解決這個問題?
感謝您的詳細解答。我讀過鏈接文章,我認爲你答案的第一部分解釋了爲什麼我沒有采取這種方法......在現實世界中,或者至少在現實世界中,當涉及到js時,我不會那樣做。目前我已經得到了你在答案的第二部分中提出的場景......這是模擬出一個假的AnotherClass。正如你所說的,希望有人能提出一個改進。 –