pytest: fixture como argumento de un fixture parametrizable.
Tengo una fixture parametrizable que funciona bien. La siguiente función es una falsa que tiene el mismo comportamiento.
@pytest.fixture(scope="function")
def parametrizable_fixture(parameters):
return parameters
Esto funciona bien con la mayoría de las pruebas de la siguiente manera:
@pytest.mark.parametrize("parameters", [["param 1", "param 2"]])
def test_dummy(parametrizable_fixture):
assert parametrizable_fixture == ["param 1", "param 2"]
Sin embargo, si quiero colocar otra fixture (como se define a continuación) como parámetro de la primera fixture, la prueba falla:
@pytest.fixture(scope="function")
def param2fixture():
return "param 2"
@pytest.mark.parametrize("parameters", [["param 1", pytest.lazy_fixture("param2fixture")]])
def test_dummy2(parametrizable_fixture):
assert parametrizable_fixture == ["param 1", "param 2"]
La fixture perezosa no se reemplaza por el valor que debería tener, es decir, obtengo este mensaje de error:
E assert ['param 1', <lazyfixture "param2fixture"="">] == ["param 1", "param 2"]
Editar:
Estos ejemplos usan una fixture como parámetro dentro de una lista de longitud dos. Esto es solo para simplificar el problema. No hay restricciones en el número o las posiciones de dichas fixtures perezosas tomadas como parámetros.
davy.ai
Solución
Para usar un fixture como parámetro de otro fixture, debemos pasar directamente el fixture como parámetro en lugar de usar
pytest.lazy_fixture()
.Aquí está cómo podemos modificar el código para que funcione:
En el código modificado, hemos realizado dos cambios:
request
al fixtureparametrizable_fixture()
. Esto se debe a que necesitamos el objetorequest
para obtener el valor deparam2fixture
. Accedemos al valor utilizandorequest.getfixturevalue()
.parametrizable_fixture()
para que devuelva la concatenación deparameters
yparam2
.Con estos cambios, las pruebas deberían pasar sin problemas.