さてmockを試そう
よし、datetime.datetime.now()をmockで上書きするぞ!
TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
ですって・・・。
どうもdatetime自体は上書きする事が出来ない。
なので、patchを使って解決して下さいとのこと。
def setUp(self): self.config = testing.setUp() self.time = datetime.datetime(2012, 10, 1, 20, 0) class fakedatetime(datetime.datetime): @classmethod def now(cls): return self.time patcher = patch('datetime.datetime', fakedatetime) self.addCleanup(patcher.stop) patcher.start() def test_now(self): print(datetime.datetime.now())
実行結果:
Finding files... done.
Importing test modules ... done.
2012-10-01 20:00:00
気になった点
・@classmethodって何だろう?
→Javaでいうところのstaticメソッド。ここでは、now()がクラスメソッドなんでこんな感じ。
・@patchでなんとかならん?
→def test_〜毎に設定しなきゃいけなそうなんで、setUpでやったほうがいいね。
・stop/startってなんだい?
→patchの無効/有効。addCleanup()はtearDownの後に実行するメソッドを定義する
クラスメソッドって何だろう?って所で一番引っかかった。
参考:
http://docs.python.org/dev/library/unittest.mock-examples.html#partial-mocking
http://pastebin.com/uppEEihJ