【问题标题】:Using a wildcard in the middle of a URI endpoint for requests_mock JSON responses在 URI 端点中间使用通配符进行 requests_mock JSON 响应
【发布时间】:2023-01-03 22:54:14
【问题描述】:

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


    【解决方案1】:

    这是因为*?regular expression syntax 中的限定符。一旦您调整了模式以转义问号 (?) 并将星号变为贪婪匹配-任何限定符 (.*),事情应该会按预期进行:

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

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多