我一直試圖在最近的工作中應用TDD,偶爾在我需要考慮模擬的最佳方法時掛斷電話。我所從事的工作涉及大量的網絡請求和文件系統訪問,所以似乎無論如何都不是嘲弄。從GMOCK文檔中,我的理解是,我最好的選擇是通過「編碼到接口」或者通過模板來模擬類。除了嘲笑測試之外,還可以對接口進行編碼而無需額外使用接口?
下面是關於我的2個主要問題「編碼到一個接口」,這之後我會給例子,希望澄清什麼,我問:
- 當我現在有一個接口的嘲諷身邊沒有其他用途/測試,使用這種方法還有意義嗎?
- 所以,現在如果我繼續「編碼到接口」,我只爲模擬/測試做了。如果不是傳遞那個接口,我只是傳遞我想要模擬的(從那個接口繼承的),我仍然是「編碼到接口」嗎?我提出這個問題是因爲有時候這會讓人感覺更可讀
#1的示例代碼...
class Thing {
bool IsInstalled(); // multiple filesystem calls, I want to mock this method
};
bool Install(vector<Thing>& thingsToInstall) // before "coding to an interface"
bool Install(vector<unique_ptr<IInstallable>>& thingsToInstall) // after "coding to an interface"
class Thing : public IInstallable {
bool IsInstalled() override;
};
class IInstallable {
virtual bool IsInstalled() = 0;
};
我感興趣的嘲諷行爲是這些「東西」 S是否安裝與否。基於此,我可能會或可能不會做一個網絡請求(我已經嘲笑)。因此,不必傳遞「Thing」對象的向量,我必須將unique_ptr向量傳遞給IInstallable(我想要模擬的行爲/接口)。這似乎很多,所以我只能測試它,甚至不重用接口。我想我想知道我的確在這裏「編碼到接口」,這就是它的方式嗎?你也可以詳細說明它何時做,並且「編碼到接口」沒有意義嗎?
#2示例代碼...
bool Install(vector<unique_ptr<IInstallable>>& thingsToInstall) // original "coding to an interface" method from above
所以,現在我編碼到一個界面,看到我的身邊掠過唯一原因如何unique_ptrs的界面,所以我可以測試它。我有什麼理由不應該將unique_ptrs傳遞給實現IInstallable接口的「Thing」?那麼我仍然可以直接從我的模擬課程的「事情」中繼承。這也在我的代碼中感覺更具可讀性,因爲我傳遞的是一種感覺與周圍代碼(Thing)更相關的類型,而不是更通用的接口。但是,我甚至「編碼到接口」了嗎?還是我完全摧毀了「編碼到界面」的目的(除了測試)?
這是最後的方法是什麼樣子......
bool Install(vector<unique_ptr<Thing>>& thingsToInstall) // Thing still implements IInstallable, so I can mock Thing directly
謝謝任何人需要閱讀這一點,並作出迴應的時候了!我非常感謝你的幫助。
重新思考你的設計 - 也許封裝整個'矢量'是一種方式去?想想單元測試是一種改進設計的方法 - 不是相反的... –
PiotrNycz