2013-04-19 23 views
7

datetime.datetime.now()がテスト目的のために特定の日時を返すようにしたいのですが、どうすればいいですか?私はpytestのモンキーパッチ組み込み関数datetime.datetime.nowをmonkeypatchする方法は?

monkeypatch.setattr(datetime.datetime,"now", nowfunc) 

で試してみた。しかし、これはエラーが示すように、私にあなたがすることはできませんエラーTypeError: can't set attributes of built-in/extension type 'datetime.datetime'

答えて

9

エラーがわかります、あなたは(他のPython実装はCPythonのとは異なるルールを持っているかもしれないが、彼らはしばしば同様の制限があります。)Cで実装された多数の拡張タイプの属性をモンキーパッチすることはできません

方法この問題を回避するには、サブクラスを作成し、クラスをmonkeypatchします。

例えば

(私は便利pytestを持っていない...しかし、それは手動monkeypatchingで動作するので、未テスト):

class patched_datetime(datetime.datetime): pass 
monkeypatch.setattr(patched_datetime, "now", nowfunc) 
datetime.datetime = patched_datetime 
+0

良いスタートだが、その後、あなたはまた、 'nowfunc'があることを確認する必要があります正しく束縛された。ここにpy.testの素晴らしいソリューションがあります:http://stackoverflow.com/questions/20503373/how-to-monkeypatch-pythons-datetime-datetime-now-with-py-test –

1

を与えます。これを行う必要がある場合は、datetime.datetime.now()を呼び出すユーティリティ関数を持つようにテスト中のコードを変更し、その関数を指すようにすべての参照を変更する必要があります。その後、その機能をモンキーにして、選択した時間を返すことができます。

関連する問題