为什么python的monkeypatch在导入类而不是模块时不起作用?

rga*_*nte 15 python monkeypatching mocking pytest python-3.x

同时采用了接受的答案的代码,我是有问题在这里.

代码的工作原理取决于我如何导入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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ico 20

即使你没有使用mock框架,你也应该看一下修补章节的位置.通过写作

from datetime import datetime
Run Code Online (Sandbox Code Playgroud)

您正在datetime.datetime测试模块中创建一个新引用并调用它datetime.这是您在test_doesnt_work()测试中使用的参考.

通过写作

monkeypatch.setattr('datetime.datetime', mydatetime)
Run Code Online (Sandbox Code Playgroud)

你正在修补模块中datetime的绝对引用datetime:用于的模块test_works().

  • 确定您应该改用`yourmodule.datetime`。看一下模拟框架:您可以对`patch`进行很好的调整。 (2认同)

rga*_*nte 11

@Michele d'Amico的答案解释了为什么它不起作用.如果您想使用"from datetime import datetime"而不仅仅是"import datetime",这是如何使它工作的

monkeypatch.setattr(__name__ + '.datetime', mydatetime)
Run Code Online (Sandbox Code Playgroud)