如何多次模拟python模块
我有一个模块,我正在为它编写一些测试,它看起来像这样:如何多次模拟python模块,python,python-3.x,python-mock,Python,Python 3.x,Python Mock,我有一个模块,我正在为它编写一些测试,它看起来像这样: import requests def _interact_with_server(some_files): requests.post("url1", files=some_files) ... requests.get("url2") ... requests.post("url3") ... requests.delete("url4") 现在我正在编写一些测试来检查对请求的调
import requests
def _interact_with_server(some_files):
requests.post("url1", files=some_files)
...
requests.get("url2")
...
requests.post("url3")
...
requests.delete("url4")
现在我正在编写一些测试来检查对请求的调用是否使用了预期的参数。我编写了以下测试:
@patch('my_module.requests')
def test(self, requests_mock):
def handle_post(url, files=None):
if (url == "url1") and (files == <expected_files>):
response_mock = Mock()
response_mock.status_code = 200
response_mock.json.return_value = {
'jobId': '1234',
}
return response_mock
elif url == "url3":
response_mock = Mock()
response_mock.status_code = 200
response_mock.content = b''
return response_mock
else:
raise RuntimeError(f"Unexpected test case, post to the following url: {url}")
def handle_get(url):
if url == "url2":
response_mock = Mock()
response_mock.status_code = 200
response_mock.json.return_value = {
'state': 'Done'
}
return response_mock
else:
raise RuntimeError(f"Unexpected test case, get to the following url: {url}")
def handle_delete(url):
if url == "url4":
response_mock = Mock()
response_mock.status_code = 200
return response_mock
else:
raise RuntimeError(f"Unexpected test case, get to the following url: {url}")
requests_mock.post = MagicMock(side_effect=handle_post)
requests_mock.get = MagicMock(side_effect=handle_get)
requests_mock.delete = MagicMock(side_effect=handle_delete)
files=<some_files>
my_module._interact_with_server()
requests_mock.post.assert_called_with("url1", files=some_files)
requests_mock.get.assert_called_with("url2")
requests_mock.post.assert_called_with("url3")
requests_mock.delete.assert_called_with("url4")
我想知道的是,我是否可以在不同的脚本中设置模块的模拟,只需一行代码就可以将其分配给request_mock?使用pytest,您可以使用一些设置函数为测试创建一个类,这些函数可以对对象进行monkeypatch。您可以使用
autouse=True
将这些方法设置为fixture。这很好,但我不明白的是,如何将模拟请求分配给模块中使用的请求?当我看到示例用法时,他们似乎只是在测试中直接使用请求模拟。您是否有可能通过使用请求模拟来展示我上面的示例是什么样子的?您可以使用Mocker
注册请求。就这样。如果代码中其他地方的请求与之匹配,它将由自动注册的程序处理。您有这样的例子吗?或者一个链接到它应该如何工作?我想这就是我遇到问题的地方,因为mock只是用mock的默认实例替换请求。
requests_mock.post = MagicMock(side_effect=handle_post)
requests_mock.get = MagicMock(side_effect=handle_get)
requests_mock.delete = MagicMock(side_effect=handle_delete)