首页 > 解决方案 > 使用“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')

标签: pythonpython-unittest

解决方案


您的测试设置忽略了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')

推荐阅读