【问题标题】:Python monkeypatch doesn't patch function correctlyPython monkeypatch 无法正确修补功能
【发布时间】:2015-07-02 14:56:42
【问题描述】:

我正在尝试使用monkeypatch 模拟一个公共函数,但它似乎对我不起作用。

这是我的文件结构

myproject
  |-mrss
     |- feed_burner.py <- has get_feed()
     |- version_controller.py <- has get_version()
  |-tests
     |-feed_burner_tests.py

这是我的测试

from mrss.feed_burner import get_feed
from _pytest.monkeypatch import monkeypatch


 def test_first_feed(self):
        mp = monkeypatch()
        mp.setattr(mrss.version_controller, 'get_version', lambda env: 7)
        mrss_feed = get_feed(env=get_config())
        root = ET.fromstring(mrss_feed)

        self.assertEquals(21, len(programmes))

这是我的 get_feed 函数

from mrss.version_controller import get_version

def get_feed(env=os.environ):
    uploader = Uploader(env=env)
    folder = env.get('S3_FOLDER')

    version = get_version(env)
    print version.isdigit()
    print 'version is {v}'.format(v=str(version))
    if not version or not version.isdigit():
        return ''

我为get_version 得到的只是空字符串

False
version is

我试过了,但没有运气

with patch('mrss.feed_burner.get_feed.mrss.version_controller.get_version', new=lambda env: 7):
    mrss_feed = get_feed(env=get_config())
    root = ET.fromstring(mrss_feed)

    programmes = root.findall('programme')

    self.assertEquals(21, len(programmes))

【问题讨论】:

  • 测试是否与get_feed的定义在同一个文件中?
  • 没有。它们不在同一个文件中。我会更新我的完整测试
  • 您可能修补了错误的功能。如果get_feed 在文件mycode.py 中,那么您需要修补mycode.mrss.versioncontroller,而不是mrss.versioncontroller 导入到您的测试模块中。 mock 模块描述了 what to patch,我怀疑您遇到了同样的问题(解决方案是相同的,尽管我不确定是否真的发布答案)。
  • 我尝试了不同的位置,但似乎没有任何效果。我将更新我的文件结构和模块。

标签: python unit-testing mocking monkeypatching


【解决方案1】:

在你的测试函数中,

from mrss.feed_burner import get_feed
from _pytest.monkeypatch import monkeypatch


def test_first_feed(self):
    mp = monkeypatch()
    mp.setattr(mrss.version_controller, 'get_version', lambda env: 7)
    mrss_feed = get_feed(env=get_config())
    root = ET.fromstring(mrss_feed)

    self.assertEquals(21, len(programmes))

get_feed 引用的函数对象不调用 mrss.version_controller.get_version,这是您的测试模块使用的引用。它真的调用mrss.feed_burner.mrss.version_controller.get_version,这是你需要猴子补丁。 (get_feed 对其模块范围有自己的引用,这与测试模块中的引用不同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 2022-11-16
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多