回答
你可能確實開始寫B測試,並儘快實現B中你知道你需要它,然後回到A.但是當你回到A時,你可能想要使用B的模擬,以便你對A的測試真的是測試A以及它與B的交互。
部分原因是B可能會用另一個C類來完成它的一些工作。如果你想用真實的B來測試A,你還需要C,當然這個難度可以進一步擴大。
使用嘲笑你可以只有一個呼叫B方法測試檢查時,它應該與響應的交易正常,你告訴你的模擬給予,而不是依賴於實際的實現B.
的的模擬對象的概念是A的測試不應該依賴於B的測試(這就是爲什麼它被稱爲「單元」測試 - 你在獨立的獨立單元中測試代碼)。如果A使用B,那麼很難測試A是否正常工作,而不依賴於B的工作權 - 除非用一些知道對「正確」請求給出「正確」響應的「模擬」對象替換B,並檢測「錯誤」要求。這樣,如果有什麼東西打破你知道這是A錯了,而不是B。 至於開發,它有時可能發生,你還不知道B究竟是如何實現的 - 例如,B是一個Web服務的接口您還不完全瞭解詳細信息,但是您希望開始在A中開發您的業務邏輯,現在您不在乎如何調用webservice的登錄參數或以何種格式接受參數。然後你可以創建「模擬」B,讓A解決,然後獨立地添加B.這也會讓B更容易支持其他格式等等 - 因爲您從一開始就以足夠通用的方式編寫它,以便將細節抽象出來。
更好地學習如何使用嘲弄和一般TDD我建議你NAT普賴斯博客和他的書http://www.natpryce.com/
一般來說它不使用太多的嘲弄一個好主意。當你必須隔離你的應用程序層(db和view)或者外部(慢)系統時使用它們。
寫入模擬可能會讓您的測試難以閱讀,所以最好不要濫用它們。
模擬對象是一個有趣的想法,但它們與單元測試的概念相沖突。如果A類使用B類,那麼它實際上是在A類和B類中集成了邏輯。在這種情況下,A類不是單元測試的候選對象,而是集成測試的候選對象。許多所謂的TDD專家認爲,單元測試只適用於某些類,而不是全部類。
- 1. Qt,單元測試和模擬對象
- 2. 如何解釋此(犀牛)模擬單元測試失敗msg
- 3. 請解釋單元測試
- 4. 使用模擬對象在JavaScript中進行單元測試
- 5. 單元測試時我應該使用模擬對象嗎?
- 6. 單元測試私有方法和使用模擬對象
- 7. 使用模擬對象而不關聯單元測試
- 8. initializeError單元測試在Xtend中使用Mockito模擬對象
- 9. 單元測試模擬對象iPhone應用程序
- 10. 如何在Perl單元測試中重用模擬對象?
- 11. 模擬單元測試
- 12. 單元測試:模擬BundleTable.Bundles
- 13. 單元測試模擬法
- 14. 單元測試和模擬
- 15. 單元測試模擬Url.Action
- 16. 單元測試模擬HttpActionContext
- 17. 單元測試的Visual C++覆蓋/模擬對象?
- 18. 在ServiceStack中可以模擬單元測試的Request.OriginalRequest對象嗎?
- 19. 單元測試,模擬對象和ioc的最佳實踐
- 20. Web API單元測試的模擬請求對象
- 21. 不同的模擬對象來比較單元測試中的對象
- 22. QTestLib單元測試框架+ Gmock(創建QTCPServer - 模擬對象)
- 23. 模擬UserDefaults對象在單元測試返回_ArrayBuffer
- 24. iOS單元測試私人模擬對象?
- 25. 模擬java對象進行單元測試
- 26. 如何在做單元測試時模擬內部對象?
- 27. 在模擬對象單元測試中遇到問題
- 28. 單元測試用存根和模擬
- 29. Phalcon - 模擬單元測試模型
- 30. 單元測試的模擬DLL方法
請參閱http://stackoverflow.com/questions/tagged/mocking – 2010-11-26 22:07:40
*(reference)* [PHPUnit](http://www.phpunit.de/manual/3.4/en/test-doubles.html「Test雙打「),[Fowler](http://www.martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs」Mocks不是存根「) – Gordon 2010-11-26 22:19:50