我正在使用pytest和一些复杂的依赖注入灯具。我有固定装置在长链中使用其他固定装置。我希望能够改变链中间的一些灯具以进行特定的测试。
鉴于这些(简化)灯具:
@pytest.fixture
def cache():
return Cache()
# Use cache fixture in a new fixture.
@pytest.fixture
def resource(cache):
return Resource(cache=cache, working=True)
# Use resource fixture in a new fixture.
@pytest.fixture
def service(resource):
return Service(resource=resource)
还有一些测试:
def test_service_when_resource_working(service):
assert service.status == "good"
def test_service_when_resource_broken(service):
assert service.status == "bad"
如何覆盖resource
灯具,使其如下所示:
@pytest.fixture
def broken_resource(cache):
return Resource(cache=cache, working=False)
...但仅适用于test_service_when_resource_broken
测试用例?我可以创建一个使用broken_service
的{{1}},但实际情况是依赖链很长,我想重新使用所有的灯具,但有选择地在中间选择一些灯具来选择测试
我想做这样的事情(伪代码):
broken_resource
答案 0 :(得分:3)
您可以在测试中使用markers来实现您的期望。 基本上,您标记需要不同行为的测试。在fixture方法中,从请求的测试上下文和过程中查找该标记。
以下是如何做到这一点。
@pytest.fixture
def cache():
return Cache()
# Use cache fixture in a new fixture.
@pytest.fixture
def resource(request, cache):
working = True
marker = request.node.get_marker("broken")
if marker:
working = False
return Resource(cache=cache, working=working)
# Use resource fixture in a new fixture.
@pytest.fixture
def service(resource):
return Service(resource=resource)
def test_service_when_resource_working(service):
assert service.status == "good"
@pytest.mark.broken
def test_service_when_resource_broken(service):
assert service.status == "bad"