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

时间:2016-02-16 11:33:57

标签: python python-3.x mocking pytest monkeypatching

我在使用已接受答案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

2 个答案:

答案 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)

@Michele d' Amico的回答解释了为什么它不起作用。如果你想使用"来自datetime import datetime"这就是如何让它工作的方法。而不只是"导入日期时间"

monkeypatch.setattr(__name__ + '.datetime', mydatetime)