es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    @pytest.fixture(scope="function")
    def parametrizable_fixture(request, parameters):
        # El fixture 'request' es necesario para obtener el valor del otro fixture.
        # Podemos acceder al valor usando `request.getfixturevalue()`.
        param2 = request.getfixturevalue('param2fixture')
        return parameters + [param2]
    
    
    @pytest.fixture(scope="function")
    def param2fixture():
        return "param 2"
    
    
    @pytest.mark.parametrize("parameters", [["param 1"]])
    def test_dummy(parametrizable_fixture):
        assert parametrizable_fixture == ["param 1", "param 2"]
    
    
    @pytest.mark.parametrize("parameters", [["param 1"]])
    def test_dummy_2(parametrizable_fixture):
        assert parametrizable_fixture == ["param 1", "param 2"]
    

    En el código modificado, hemos realizado dos cambios:

    1. Hemos añadido un parámetro adicional request al fixture parametrizable_fixture(). Esto se debe a que necesitamos el objeto request para obtener el valor de param2fixture. Accedemos al valor utilizando request.getfixturevalue().
    2. Hemos modificado el valor de retorno de parametrizable_fixture() para que devuelva la concatenación de parameters y param2.

    Con estos cambios, las pruebas deberían pasar sin problemas.

Comments are closed.