如何在多个测试中重用 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):
...
如您所见,您可以将其应用于所有应模拟请求的测试函数,一切顺利。
有不同的测试函数读取同一个 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):
...
如您所见,您可以将其应用于所有应模拟请求的测试函数,一切顺利。