我正在尝试修补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__()
然而,在您展示的补丁中,您犯了一些关键错误。
- 您尚未定义
__enter__
的返回值 - 初始化
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'}