我也忘了什麼時候開始習慣作 unit testing 了,可能是前一個專案在 Xcode 上就開始學著寫一點測試了。
這次在閱讀 Writing Testable Code 對於 6. Static methods: (or living in a procedural world),格外有感覺。
尤其是修改別人的程式碼的時候,如果他總是直接呼叫 static method,不讓你用 mock object 把 implementation 換掉的話,這樣在測試起來就顯得麻煩的多。舉例來說,有一個 class method 會呼叫 SSHHelper.execute_ssh 這個指令去遠端執行一些東西,但這對 unit testing 而言就是一種外部的 dependency,你絕對不希望他真的在測試的時候跑出個 ssh 真的連過去執行些什麼吧。
剛好這次用 MiniMock 作我們的 mock library,因為他的因素,你就可以這樣作
minimock.mock('SSHHelper.execute_ssh', returns=ssh_output)
如此一來,execute_ssh 這個 method 的結果就可以簡單的換成你預期的 ssh_output。
如果是本來就有比較好的設計的話,你也可以用 minimock.Mock (注意大小寫),去產生一個 mock object 出來。
mock_fs = minimock.Mock('MockFileSystem') mock_fs.size.mock_returns = 1 mytools.fs_imp = mock_fs
如此一來 mock 就顯得簡單多了……
話說回來,之前想寫的 objective-c 跟 DTrace 的 topic 真的都忘的差不多了,算了,以後再說吧,也許之後把 python 的 Exception Chaining and Embedded Tracebacks 的想法整理一下再丟出來吧。