11

テスト目的で が特定の日時を返すことを確認したいのですがdatetime.datetime.now()、どうすればよいですか? 私はpytestのmonkeypatchで試しました

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

しかし、これは私にエラーを与えますTypeError: can't set attributes of built-in/extension type 'datetime.datetime'

4

2 に答える 2

10

エラーが示すように、C で実装されている多くの拡張タイプの属性にモンキーパッチを適用することはできません (他の Python 実装には CPython とは異なるルールがある場合がありますが、多くの場合、同様の制限があります)。

これを回避するには、サブクラスを作成し、そのクラスにモンキーパッチを適用します。

pytest:

class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime
于 2013-04-19T19:39:22.850 に答える
1

エラーが示すように、できません。これを行う必要がある場合は、テスト対象のコードを変更して、 を呼び出すユーティリティ関数が含まれるようにしdatetime.datetime.now()、代わりにその関数を指すようにすべての参照を変更する必要があります。次に、その関数をモンキーパッチして、選択した時間を返すことができます。

于 2013-04-19T19:39:11.727 に答える