Estoy buscando, por ejemplo, cómo usar el accesorio "session-mocker" de alcance de sesión del complemento pytest-mock.

Está bastante claro cómo modificar el ejemplo que proporcionan los documentos para usarlo en una prueba en particular:

def test_foo(session_mocker):
    session_mocker.patch('os.remove')
    etc...

Pero estoy desconcertado sobre dónde y cómo se debe inicializar este dispositivo global. Digamos, por ejemplo, que quiero simular "os.remove" para TODAS mis pruebas. ¿Lo configuro en confftest.py y, de ser así, cómo lo hago?

0
Gadzooks34 4 mar. 2021 a las 01:06

1 respuesta

La mejor respuesta

Lo usas en un accesorio con un alcance de sesión. El mejor lugar para ponerlo sería conftest.py. Eso es principalmente para que sea obvio para otros programadores que este dispositivo existe y lo que podría estar haciendo. Eso es importante porque este dispositivo afectará a otras pruebas que quizás no necesariamente conozcan este dispositivo o incluso lo deseen.

No recomendaría burlarse de algo durante la duración de una sesión. Pruebas, clases o incluso módulos, sí. Pero no sesiones.

Por ejemplo, la siguiente prueba test_normal pasa o falla dependiendo de si test_mocked se ejecutó en la misma sesión o no. Dado que están en el mismo "archivo", es mucho más fácil detectar el problema. Pero estas pruebas podrían estar ubicadas en diferentes archivos de prueba, que no parecen estar relacionados y, sin embargo, si ambas pruebas se ejecutaran en la misma sesión, se produciría el problema.

import pytest

# could be in conftest.py
@pytest.fixture(scope='session')
def myfixture(session_mocker):
    session_mocker.patch('sys.mymock', create=True)

def test_mocked(myfixture):
    import sys
    assert hasattr(sys, 'mymock')

def test_normal():
    import sys
    assert not hasattr(sys, 'mymock')

En su lugar, simplemente cree un accesorio que tenga el alcance de prueba, clase o módulo, e inclúyalo directamente en el archivo de prueba. De esa manera, el comportamiento está contenido solo en el conjunto de pruebas que lo necesitan. Los simulacros son baratos de crear, por lo que tenerlos recreados para cada prueba no es gran cosa. Incluso puede ser beneficioso, ya que el simulacro se reiniciará para cada prueba.

Guarde los accesorios de sesión para cosas que son costosas de configurar y que no tienen estado, o que las pruebas no cambian su estado (por ejemplo, una base de datos que se usa como plantilla para crear una nueva base de datos contra la que se ejecutará cada prueba).

0
Dunes 3 mar. 2021 a las 23:02