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'')