python - 如何在Python的请求库中模拟 session 中的副作用?

标签 python unit-testing mocking python-requests

这是我提出的问题的后续 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/

相关文章:

java - 在@Before 之外使用@InjectMocks

mono - Mono/MonoTouch 上的 Moq(或可能是另一个框架)

java - 模拟静态方法

javascript - 使用 Jest 模拟简单的内部函数以在渲染的 React 组件中使用

python - 使用一个 pandas 数据帧填充另一个 pandas 数据帧中的新列

Python继承模式——如何处理反序列化

swift - 如何为 completionHandler 引发错误?

python - 使用 Python/Pandas 解析嵌套 JSON

python程序使用递归查找数字是偶数还是奇数

unit-testing - VS.Net 单元测试可以在 IDE 之外运行吗?