如何在请求模拟中模拟多个URL

时间:2020-10-08 15:39:07

标签: python-3.x python-requests python-mock requests-mock

我有一个方法,它调用两个不同的端点并验证那里的响应。

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**

似乎只是它的唯一嘲笑的第一个网址。

那么有什么方法可以在一种方法中模拟多个网址?

2 个答案:

答案 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