Python 使用 "with" 语句时的单元测试请求会话
Python unittest request session when "with" statement is used
我想在单元测试中模拟 requests.session()。当我不使用 with
语句时它可以工作,但是当我开始使用它时它会失败。这是我执行的代码:
main.py:
import requests
def parse():
with requests.session() as s:
return s.get('foo')
if __name__ == "__main__":
parse()
测试_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
来自上下文管理器 class 的 __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')
我想在单元测试中模拟 requests.session()。当我不使用 with
语句时它可以工作,但是当我开始使用它时它会失败。这是我执行的代码:
main.py:
import requests
def parse():
with requests.session() as s:
return s.get('foo')
if __name__ == "__main__":
parse()
测试_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
来自上下文管理器 class 的 __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')