在requests_mock JSON响应的URI端点中间使用通配符



我有一些代码,我想测试,它是一个相当普通的GET请求包装器,但它的实现从API请求数据多次与不同的id。

为测试添加模拟JSON响应是有问题的,因为有数百个具有这些id的调用,我们希望针对一个固定的响应进行测试。

目标URI看起来像https://someurl.com/api/v1/id/1234/data?params

我们遇到的问题是不想为每个模拟端点添加一行代码。

。而不是

mocker.get('https://someurl.com/api/v1/id/1234/data?params',
json={},
status_code=200)
mocker.get('https://someurl.com/api/v1/id/5678/data?params',
json={},
status_code=200)

我想实现一些通配符匹配,像这样:

mocker.get(re.compile('https://someurl.com/api/v1/id/*/data?params'),
json={},
status_code=200)

如果我正确理解文档,这应该是可能的,但这会返回一个错误:

Failed: [undefined]requests_mock.exceptions.NoMockAddress: No mock address: GET https://someurl.com/api/v1/id/1234/data?params

这是因为*?是正则表达式语法中的限定符。一旦您调整模式以转义问号(?)并将星号转换为贪婪匹配任何限定符(.*),事情应该像预期的那样工作:

>>> requests_mock.register_uri(
...     'GET',
...     re.compile(r'https://someurl.com/api/v1/id/.*/data?params'),
...     json={},
...     status_code=200
... )
>>> requests.get('https://someurl.com/api/v1/id/1234/data?params').status_code
200
>>> requests.get('https://someurl.com/api/v1/id/lorem-ipsum-dolor-sit-amet/data?params').status_code
200

最新更新