Tengo estas dos afirmaciones que se repiten en muchas de mis pruebas unitarias.

        with patch('/path') as mocked_thing1:
            mocked_thing1.return_value = 'some value'
            with patch('/path') as mocked_thing2:
                mocked_thing2.return_value = 'some value'

¿Hay alguna manera de que pueda escribir una función para ella y simplemente llamarla en lugar de escribir estas líneas repetidamente en mis casos de prueba?

0
Mujeeb Ur Rehman 31 ago. 2020 a las 12:40

1 respuesta

La mejor respuesta

Si desea cambiar el valor de retorno para diferentes pruebas, no tiene más remedio que asignar el valor de retorno en cada prueba. Una forma sería agregar accesorios separados para los simulacros:

@pytest.fixture
def mock_thing1():
    with patch('/path') as mocked_thing1:
        yield mocked_thing1

@pytest.fixture
def mock_thing2():
    with patch('/path') as mocked_thing2:
        yield mocked_thing2

def test_something(mock_thing1, mock_thing2):
    mocked_thing1.return_value = 'some value'
    mocked_thing2.return_value = 'some value'
    ...

Otra posibilidad es utilizar parámetros indirectos del aparato para establecer el valor de retorno en el aparato:

@pytest.fixture
def mock_thing1(request):
    with patch('/path') as mocked_thing1:
        mocked_thing1.return_value = request.param
        yield mocked_thing1

@pytest.fixture
def mock_thing2(request):
    with patch('/path') as mocked_thing2:
        mocked_thing2.return_value = request.param
        yield mocked_thing2


@pytest.mark.parametrize("mock_thing2", ['some other value'], indirect=True)
@pytest.mark.parametrize("mock_thing1", ['some value'], indirect=True)
def test_something(mock_thing1, mock_thing2):
    ...

O simplemente podría usar la versión decoradora de patch en lugar de cualquier accesorio, para que al menos el cuerpo de prueba sea mejor legible:

@mock.patch("mock_thing2", return_value='some other value')
@mock.patch("mock_thing1", return_value='some value')
def test_something(mock_thing1, mock_thing2):
    ...
0
MrBean Bremen 2 sep. 2020 a las 12:46