我不是在谈论" Fixture Parametrizing"由pytest定义,我在谈论你传递给函数的实际参数(在这种情况下是fixture函数),以使代码更加模块化。
为了演示,这是我的装置
@yield_fixture
def a_fixture(a_dependency):
do_setup_work()
yield
do_teardown_work()
a_dependency.teardown()
如您所见,我的装置依赖于a_dependency
,其中还需要调用其拆卸()。我知道在天真的用例中,我可以这样做:
@yield_fixture
def a_dependency():
yield
teardown()
@yield_fixture
def a_fixture(a_dependency):
do_setup_work()
yield
do_teardown_work()
但是,虽然a_fixture
代码可以放在中心位置并由所有测试重用,但a_dependecy
代码是特定于测试的,每个测试可能需要创建一个新的a_dependency
代码。 1}}对象。
我想避免将夹具和依赖项复制粘贴到我的所有测试中。如果这是常规的python代码,我可以将a_dependecy
作为函数参数传递。如何将此对象传递给共享夹具?
答案 0 :(得分:0)
在我看来,也许你不希望a_dependency
成为一个装置,你只是想让它成为常规功能。你喜欢这样的事吗?
def a_dependency():
# returns a context manager
@yield_fixture
def a_fixture():
with a_dependency() as dependency:
do_setup_work()
yield
do_teardown_work()
答案 1 :(得分:0)
好吧,如果a_dependency
真的必须成为一个夹具,为什么不是两全其美?装饰者毕竟只是语法糖。
def a_dependency():
# returns a context manager
a_dependency_fixture = yield_fixture(a_dependency)
@yield_fixture
def a_fixture():
# here use a_dependency as a regular function
with a_dependency() as dependency:
do_setup_work()
yield
do_teardown_work()
def test_foo(a_dependency_fixture):
# here use a_dependency as a fixture
pass
我没有检查过这确实有效,因为问题中的信息对于我来说太过通用了。如果您能提供更多细节,可能更容易提供更有用的答案。