为什么 python 的 monkeypatch 在导入 class 而不是模块时不起作用?
Why python's monkeypatch doesn't work when importing a class instead of a module?
我在使用已接受答案的代码时遇到问题 here。
代码的工作取决于我如何导入日期时间。这是为什么呢?是否可以模拟它以便双向工作?
我正在使用 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
即使您没有使用 mock
framework you should take a look to where to patch 章节。通过写作
from datetime import datetime
您正在测试模块中创建对 datetime.datetime
的新引用并将其命名为 datetime
。这是您在 test_doesnt_work()
测试中使用的参考。
通过写作
monkeypatch.setattr('datetime.datetime', mydatetime)
您正在修补 datetime
模块中 datetime
的绝对引用:test_works()
中使用的模块。
@Michele d'Amico 的回答解释了为什么它不起作用。如果您想使用 "from datetime import datetime" 而不仅仅是 "import datetime"
,这就是使它工作的方法
monkeypatch.setattr(__name__ + '.datetime', mydatetime)
我在使用已接受答案的代码时遇到问题 here。
代码的工作取决于我如何导入日期时间。这是为什么呢?是否可以模拟它以便双向工作?
我正在使用 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
即使您没有使用 mock
framework you should take a look to where to patch 章节。通过写作
from datetime import datetime
您正在测试模块中创建对 datetime.datetime
的新引用并将其命名为 datetime
。这是您在 test_doesnt_work()
测试中使用的参考。
通过写作
monkeypatch.setattr('datetime.datetime', mydatetime)
您正在修补 datetime
模块中 datetime
的绝对引用:test_works()
中使用的模块。
@Michele d'Amico 的回答解释了为什么它不起作用。如果您想使用 "from datetime import datetime" 而不仅仅是 "import datetime"
,这就是使它工作的方法monkeypatch.setattr(__name__ + '.datetime', mydatetime)