我有一些代码,我想测试,它是一个相当普通的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