如何在多个测试中重用 requests_mock

How to reuse requests_mock in many tests

有不同的测试函数读取同一个 api。

例如:获取:https://my.api/people

我想模拟这个请求的响应。因此我使用 requests_mock library.

设想以下测试:

def test_get_people_names():
   names = [name for name in people_service.getPeople()] # this goes to the API GET URL
   assert len(names) > 0

def test_get_people_ages():
   ages = [age for age in people_service.getPeople()]
   assert len(ages) > 0

使用此代码,我想测试 people_service 是否正在使用它的技巧来访问正确的 API,而不是 API 功能。

有了 requests_mock 我看到我可以做到:

def test_get_people_ages(requests_mock):
   requests_mock.get('https//my.api/people', text=SOME_JSON)
   ages = [age for age in people_service.getPeople()]
   assert len(ages) > 0

我该怎么做才能避免为每个测试重写同一行 (requests_mock.get...)?

(如果需要改API或json,我只能改1处)

问题是这个 requests_mock 看起来不像是 class(小写的名称)并且可以在上下文管理方式中使用(在这种情况下,class 模拟).

我可以在传递这个 get 参数后到处使用这个 Mock 对象吗?这会产生什么影响(不使用上下文管理或不在本地使用它)?

您可以使用 request_mock 夹具创建另一个夹具。

@pytest.fixture
def your_requests_mock(requests_mock):
    # Use return to be able to access requests_mock attributes
    return requests_mock.get('https//my.api/people', text=SOME_JSON)

def test_get_people_ages(your_requests_mock):
    ...

如您所见,您可以将其应用于所有应模拟请求的测试函数,一切顺利。