我在使用已接受答案here的代码时遇到了问题。
代码的工作原理取决于我如何导入datetime。为什么会这样?是否可以嘲笑它以便双向工作?
我正在使用Python 3.4
。以下代码说明了问题:
import pytest
from datetime import datetime
mockdate = datetime(2000, 1, 1, 0, 0, 0)
@pytest.fixture(autouse=True)
def patch_datetime_now(monkeypatch):
class mydatetime:
@classmethod
def now(cls):
return mockdate
monkeypatch.setattr('datetime.datetime', mydatetime)
def test_doesnt_work():
assert datetime.now() == mockdate
def test_works():
import datetime
assert datetime.datetime.now() == mockdate
答案 0 :(得分:18)
即使您没有使用mock
框架,也应该查看where to patch章节。通过写作
from datetime import datetime
您正在测试模块中创建对datetime.datetime
的新引用,并将其命名为datetime
。这是您在test_doesnt_work()
测试中使用的参考。
写作
monkeypatch.setattr('datetime.datetime', mydatetime)
您正在datetime
模块中修补datetime
的绝对引用:test_works()
中使用的那个。
答案 1 :(得分:10)
monkeypatch.setattr(__name__ + '.datetime', mydatetime)