`requests_mock` 适用于所有请求,即使它们未设置并抛出 NoMockAddress 异常

`requests_mock` applies to all requests even if they are not set and throws NoMockAddress exception

我发现 requests_mock 用作 pytest 的固定装置适用于所有请求,即使它们未设置也是如此。

我不确定这是 requests_mock/pytest 错误还是我遗漏了什么。最终,我不需要模拟 'api-b' 调用,但我找不到如何避免它。

def test_reqs(requests_mock):
    requests_mock.get('https://api-a.com/')
    requests.get('https://api-b.com/')
    assert requests.get('https://api-a.com/')

我正在使用 pytestrequests-mockpytest-mock 为 API 端点编写集成测试。在幕后,这个端点多次调用我需要模拟的不同第三方API。

其中一些调用可以被 requests_mock 模拟。 但是他们中的一些人不能,因为他们从第三方模块内部进行调用。

我试过用pytest-mock模拟最后一个,发现基本不行。 requests_mock 仍在尝试模拟该调用并抛出下一个错误: requests_mock.exceptions.NoMockAddress: No mock address: GET https://api-b.com/

正如 requests-mock doc 所说,您可以通过在启动 requests_mock.Mocker().

时设置 real_http=True 来实现此行为
with requests_mock.Mocker(real_http=True) as m:
    m.get('http://test.com', text='resp')
    requests.get('http://test.com').text

但没有说明如何将其与 pytest 一起使用。 由于 pytest 测试接收 request_mock 对象作为参数(夹具),您可以在测试中显式设置它。

def test_reqs(requests_mock):
    requests_mock.real_http = True

    requests_mock.get('https://api-a.com/')
    requests.get('https://google.com/')
    assert requests.get('https://api-a.com/')