python - 使用“with”语句时的 Python unittest 请求会话
问题描述
我想在单元测试中模拟 requests.session() 。当我不使用with
语句时它可以工作,但是当我开始使用它时它会失败。这是我执行的代码:
主要.py:
import requests
def parse():
with requests.session() as s:
return s.get('foo')
if __name__ == "__main__":
parse()
test_main.py:
import unittest
import mock
from unittest.mock import patch
from main import parse
class TestDoSessionGet(unittest.TestCase):
@mock.patch('main.requests.session')
def test_should_mock_session_get(self, session_mock):
session_mock.return_value = mock.MagicMock(get=mock.MagicMock(return_value='bar'))
self.assertEqual(parse(), 'bar')
解决方案
您的测试设置忽略了s
来自__enter__
上下文管理器类的方法的事实。
您还需要模拟该呼叫
import unittest
from unittest import mock
from main import parse
class TestDoSessionGet(unittest.TestCase):
@mock.patch('main.requests.session')
def test_should_mock_session_get(self, session_mock):
mocked_session = mock.MagicMock()
mocked_session.__enter__.return_value = mock.MagicMock(get=mock.MagicMock(return_value='bar'))
session_mock.return_value = mocked_session
self.assertEqual(parse(), 'bar')
推荐阅读
- python - XLWT DuplicateWorksheetName 错误,仅适用于 2 个函数中的 1 个
- django - 使用 prefetch_related 过滤没有子对象的父对象
- c++ - Clang 不允许在默认参数之后使用可变参数,gcc 允许
- reactjs - 摩纳哥编辑器 deltaDecorations 更改整个文本的样式,而不仅仅是给定范围
- ssis - 当 Fact 表中的记录发生变化时该怎么办?
- r - 使用 lapply 将 R 中的两个矩阵列表相乘
- azure - 在 Azure DevOps 中关闭项目
- javascript - Node.js Handlebars 将数据从 mySQL 数据库显示到引导模式
- windows - 更改了phpmyadmin密码,现在我无法进入
- flutter - 使用 Flutter 将自定义屏幕投射到 Chromecast