这是我提出的问题的后续 yesterday .
我正在尝试模拟 requests
库的 session 。虽然我得到了如何模拟成功返回值的答案,但我仍在尝试弄清楚如何模拟副作用,例如 400、401 或 302 等。
这就是我模拟 session 的方式:
>>> 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')
现在,据我所知,我需要模拟 session_instance.request.side_effect
。如果我尝试做这样的事情,它会失败:
response_redirect = mock.MagicMock()
response_redirect.status_code = 302
response_redirect.headers = {"location": "https://absolute"}
session_instance.request.side_effect = response_redirect
response = _request_url('METHOD', 'https://absolute')
self.assertEqual(result, response_redirect)
#Assertion error
最佳答案
你不需要副作用。您的“重定向”响应只是 session.request
调用的另一个返回值。在 mock_return
引用上设置属性:
mock_response = session_instance.request.return_value
mock_response.status_code = 302
mock_response.headers = {"location": "https://absolute"}
response = _request_url('METHOD', 'http://absolute')
在需要时使用.side_effects
:
- 引发异常
- 处理多个调用(您可以将
side_effects
设置为要生成的返回值序列,按顺序使用)。 - 需要访问已传递给调用的值(您可以将
side_effect
设置为将使用相同参数调用的函数)。
但是:如果您正在测试的代码是 _request_url()
,那么请求是否导致重定向或应该无关紧要不是。 _request_url()
中的代码与返回的响应类型完全无关,那么为什么您需要对此进行测试呢?
另一方面,如果您正在测试使用 _request_url()
作为实用函数的代码,那么您应该模拟该函数>,而不是 requests
库。
关于python - 如何在Python的请求库中模拟 session 中的副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148452/