为什么 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)