Python/Pytest:Pytest_sessionstart()中的修补函数未返回预期值
我正在尝试修补Pytest的Pytest_sessionstart()中的函数。但是,我希望补丁函数返回{'SENTRY\u DSN':“error”}。我将在测试运行中返回对象Python/Pytest:Pytest_sessionstart()中的修补函数未返回预期值,python,pytest,Python,Pytest,我正在尝试修补Pytest的Pytest_sessionstart()中的函数。但是,我希望补丁函数返回{'SENTRY\u DSN':“error”}。我将在测试运行中返回对象 import pytest from unittest.mock import patch, Mock def pytest_sessionstart(session): """ :type request: _pytest.python.SubRequest :
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__()
这里的问题似乎是您没有正确配置
Mock
对象。根据您显示的代码,我假设您正在以以下方式调用某个函数:
with foobar() as fb:
# something happens with fb here
该调用的计算结果本质上是:
foobar().__enter__()
然而,在您展示的补丁中,您犯了一些关键错误
\uuuu enter\uuuu
的返回值Mock
对象时,它会返回一个全新的Mock
对象,因此,当您在函数末尾调用\uuuuuu\uuuu
时,它会返回一个全新的对象,而不是您最初创建的对象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\u my\u func()。\uu enter\uu()
返回mock\u context
,我们可以在执行以下操作时看到它按预期工作:
with mock_my_func() as mf:
print(mf())
>> {'SENTRY_DSN': 'WRONG'}
@gold\u cy正确地回答了这一点,因此这只是一个补充:如前所述,您正在将
return\u值设置为patch
对象,而不是模拟本身。最简单的纠正方法是使用:
来自unittest.mock导入修补程序的
def pytest_会话启动(会话):
"""
:键入请求:_pytest.python.SubRequest
:返回:
"""
mock_my_func=patch('core.my_func',返回值={'SENTRY\u DSN':“错误”})
模拟我的函数开始()
这将设置模拟的返回值,而无需创建单独的mock
对象。您还可以在调用函数my_func
的位置添加代码。