python unit-testing python-unittest python-mock

Python burlarse de una función de un módulo importado



title in python plot (2)

Cuando está utilizando el decorador de patch del paquete unittest.mock no está aplicando parches al espacio de nombres desde el que se importa el módulo (en este caso, app.my_module.get_user_name ), lo está app.my_module.get_user_name en el espacio de nombres bajo la prueba app.mocking.get_user_name .

Para hacer lo anterior con Mock prueba algo como lo siguiente:

from mock import patch from app.mocking import test_method class MockingTestTestCase(unittest.TestCase): @patch(''app.mocking.get_user_name'') def test_mock_stubs(self, test_patch): test_patch.return_value = ''Mocked This Silly'' ret = test_method() self.assertEqual(ret, ''Mocked This Silly'')

La documentación de la biblioteca estándar incluye una section útil section describe esto.

Quiero entender cómo poner en @patch una función de un módulo importado.

Aquí es donde estoy hasta ahora.

app / mocking.py:

from app.my_module import get_user_name def test_method(): return get_user_name() if __name__ == "__main__": print "Starting Program..." test_method()

app / my_module / __ init__.py:

def get_user_name(): return "Unmocked User"

test / mock-test.py:

import unittest from app.mocking import test_method def mock_get_user(): return "Mocked This Silly" @patch(''app.my_module.get_user_name'') class MockingTestTestCase(unittest.TestCase): def test_mock_stubs(self, mock_method): mock_method.return_value = ''Mocked This Silly'') ret = test_method() self.assertEqual(ret, ''Mocked This Silly'') if __name__ == ''__main__'': unittest.main()

Esto no funciona como esperaría. El módulo "parcheado" simplemente devuelve el valor no get_user_name de get_user_name . ¿Cómo me burlo de los métodos de otros paquetes que estoy importando en un espacio de nombres bajo prueba?


Mientras que la respuesta de Matti John resuelve su problema (y me ayudó también, ¡gracias!), Yo sugeriría que se localice el reemplazo de la función original ''get_user_name'' por la que se burló. Esto le permitirá controlar cuándo se reemplaza la función y cuándo no. Además, esto le permitirá realizar varios reemplazos en la misma prueba. Para hacerlo, use la declaración ''con'' de una manera bastante similar:

from mock import patch class MockingTestTestCase(unittest.TestCase): def test_mock_stubs(self): with patch(''app.mocking.get_user_name'', return_value = ''Mocked This Silly''): ret = test_method() self.assertEqual(ret, ''Mocked This Silly'')