さて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