【问题标题】:Why python's monkeypatch doesn't work when importing a class instead of a module?为什么python的monkeypatch在导入类而不是模块时不起作用?
【发布时间】:2016-02-16 11:33:56
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    即使你没有使用mock 框架,你也应该看看where to patch 章节。通过写作

    from datetime import datetime
    

    您正在测试模块中创建对datetime.datetime 的新引用,并将其命名为datetime。这是您在test_doesnt_work() 测试中使用的参考。

    通过写作

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

    您正在修补datetime 在datetime 模块中的绝对引用:在test_works() 中使用的那个。

    【讨论】:

    • 谢谢,这很有用。那么,您是否知道任何方法可以使其与“从日期时间导入日期时间”而不是“导入日期时间”一起使用?
    • 当然你应该修补yourmodule.datetime。看看mock框架:可以patch很好用。
    • 我已经使用该解决方案创建了一个新答案,但我仍然认为将您的答案标记为已接受是公平的。干杯!
    【解决方案2】:

    @Michele d'Amico 的回答解释了为什么它不起作用。如果您想使用“从日期时间导入日期时间”而不仅仅是“导入日期时间”,这就是如何使其工作

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

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 2012-03-07
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2014-01-30
      相关资源
      最近更新 更多