如何在Python的请求库中模拟会话? [英] how to mock session in Python's request library?
问题描述
我一直在试图找出如何精确模拟Python请求库的会话,但是直到现在都找不到解决方案.这是我的common.py代码,我需要为此进行测试:
I have been trying to figure out how exactly to mock the session of Python's request library but couldn't find a solution till now. Here's my code of common.py that i need to write a test for:
import requests
def request_url(method, url):
return _request_url(method, url)
def _request_url(method, url):
session = requests.session()
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)
return session.request(method, url)
推荐答案
只需模拟整个_request_url
函数,而不必理会会话对象.该函数所做的全部工作就是提供一个响应对象,模拟该函数并返回一个模拟响应对象.
Just mock the whole _request_url
function, and not bother with the session object. All that the function does is provide a response object, mock that function and return a mock response object.
但是,如果您要测试_request_url
函数本身,则只需模拟session
名称即可;额外的调用将全部传递给模拟.然后,您可以为mocked.return_value.rquest.return_value
对象提供您选择的响应对象.
However, if you are testing the _request_url
function itself, then just mock the session
name; the additional calls will all be passed to the mock. You can then provide a response object of your choosing for the mocked.return_value.rquest.return_value
object.
所以
from unittest import mock
with mock.patch('requests.session') as mock_session:
session_instance = mock_session.return_value
mock_response = session_instance.request.return_value
response = _request_url('METHOD', 'some url')
assert response is mock_response
session_instance.mount.assert_called()
session_instance.request.assert_called_with('METHOD', 'some url')
或在TestCase
方法中:
@mock.patch('requests.session')
def test_request_url(self, mock_session):
session_instance = mock_session.return_value
mock_response = session_instance.request.return_value
response = _request_url('METHOD', 'some url')
self.assertTrue(response is mock_response)
session_instance.mount.assert_called()
session_instance.request.assert_called_with('METHOD', 'some url')
演示:
>>> from unittest import mock
>>> import requests, ssl
>>> class TlsAdapter:
... # mocked adapter, just for illustration purposes
... def __init__(self, *args, **kwargs): pass
...
>>> def _request_url(method, url):
... session = requests.session()
... adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
... session.mount("https://", adapter)
... return session.request(method, url)
...
>>> with mock.patch('requests.session') as mock_session:
... session_instance = mock_session.return_value
... mock_response = session_instance.request.return_value
... response = _request_url('METHOD', 'some url')
... assert response is mock_response
... session_instance.mount.assert_called()
... session_instance.request.assert_called_with('METHOD', 'some url')
...
>>> # nothing happened, because the test passed, no assertion errors were raised
...
这篇关于如何在Python的请求库中模拟会话?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!