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

0 人关注

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

为测试添加模拟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
    
python
mocking
wildcard
requests-mock
Phil Gunning
Phil Gunning
发布于 2022-06-01
1 个回答
hoefling
hoefling
发布于 2022-08-13
已采纳
0 人赞同

这是因为 * ? 是在 正则表达式语法 .一旦你调整模式以摆脱问号( \? ),并将星号转为贪婪的匹配-任何限定符( .* ),事情就会像预期的那样进行。

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