我有一个方法,它调用两个不同的端点并验证那里的响应。
def foo_bar:
status_1 = requests.post(
"http://myapi/test/status1", {},
headers=headers)
status_2 = requests.post(
"http://myapi/test/status2", {},
headers=headers)
# and check the responses ...
我想像这样在pytest中模拟这两个网址:
def foo_test:
with requests_mock.Mocker() as m1:
m1.post('http://myapi/test/status1',
json={},
headers={'x-api-key': my_api_key})
m1.post('http://myapi/test/status2',
json={},
headers={'x-api-key': my_api_key})
总是抛出错误
**NO mock address: http://myapi/test/status2**
似乎只是它的唯一嘲笑的第一个网址。
那么有什么方法可以在一种方法中模拟多个网址?
答案 0 :(得分:0)
是的。来自docs:“ requests_mock.ANY处有一个特殊符号,它用作匹配任何内容的通配符。可以用作方法和/或URL的替换。”
import requests_mock
with requests_mock.Mocker() as rm:
rm.post(requests_mock.ANY, text='resp')
我不确定这是否是最好的方法,但对我有用。您可以随后断言使用哪个URL:
urls = [r._request.url, for r in rm._adapter.request_history]
答案 1 :(得分:0)
我认为您还有其他事情要做,一次模拟出一条这样的路径是很正常的,这样您就可以简单地从不同的路径返回不同的值。您的示例对我有用:
import requests
import requests_mock
with requests_mock.Mocker() as m1:
my_api_key = 'key'
m1.post('http://myapi/test/status1',
json={},
headers={'x-api-key': my_api_key})
m1.post('http://myapi/test/status2',
json={},
headers={'x-api-key': my_api_key})
headers = {'a': 'b'}
status_1 = requests.post("http://myapi/test/status1", {}, headers=headers)
status_2 = requests.post("http://myapi/test/status2", {}, headers=headers)
assert status_1.status_code == 200
assert status_2.status_code == 200