Pytest_sessionstart()中的Python/Pytest:patched函数未返回预期值



我正在尝试修补Pytest的Pytestrongessionstart()中的一个函数。但是,我希望补丁函数返回{'ENTRY_DSN':"错误"}。我回来了<MagicMoc。。。id='4342393248'>测试运行中的对象。

import pytest
from unittest.mock import patch, Mock
def pytest_sessionstart(session):
"""
:type request: _pytest.python.SubRequest
:return:
"""
mock_my_func = patch('core.my_func')
mock_my_func.return_value = {'SENTRY_DSN': "WRONG"}
mock_my_func.__enter__()
def unpatch():
mock_my_func.__exit__()

@gold_cy已经正确回答了这个问题,所以这只是一个补充:如前所述,您将return_value设置为patch对象,而不是mock本身。最简单的纠正方法是使用

from unittest.mock import patch
def pytest_sessionstart(session):
"""
:type request: _pytest.python.SubRequest
:return:
"""
mock_my_func = patch('core.my_func', return_value = {'SENTRY_DSN': "WRONG"})
mock_my_func.start()

这将设置mock的返回值,而无需创建单独的Mock对象。

这里的问题似乎是您没有正确配置Mock对象。考虑到您显示的代码,我假设您正在以以下方式调用某个函数:

with foobar() as fb:
# something happens with fb here

该调用本质上评估为:

foobar().__enter__()

然而,在您展示的补丁中,您犯了一些关键错误。

  1. 您尚未定义__enter__的返回值
  2. 初始化Mock对象时,它会返回一个全新的Mock对象,因此,当您在函数末尾调用__enter__时,它返回的是一个全新对象,而不是您最初创建的对象

如果我理解正确,你可能想要这样的东西:

import pytest
from unittest.mock import patch, Mock
def pytest_sessionstart(session):
"""
:type request: _pytest.python.SubRequest
:return:
"""
mock_my_func = patch('core.my_func')
mock_context = Mock()

mock_context.return_value = {'SENTRY_DSN': "WRONG"}
mock_my_func.return_value.__enter__.return_value = mock_context

# this now returns `mock_context`
mock_my_func().__enter__()

现在mock_my_func().__enter__()返回mock_context,当我们执行以下操作时,我们可以看到它如预期一样工作:

with mock_my_func() as mf:
print(mf())
>> {'SENTRY_DSN': 'WRONG'}

最新更新