python - what - Pruebas de Django-objeto de parche en todas las pruebas
web applications with django (2)
Necesito crear algún tipo de MockMixin
para mis pruebas. Debe incluir simulacros para todo lo que llama fuentes externas. Por ejemplo, cada vez que guardo el modelo en el panel de administración, invoco algunas URL remotas. Sería bueno, tener eso burlado y usar así:
class ExampleTestCase(MockedTestCase):
# tests
Entonces, cada vez que guardo el modelo en admin, por ejemplo, en pruebas funcionales, se aplica este simulacro en lugar de llamar a URL remotas.
¿Es eso realmente posible? Soy capaz de hacer eso para 1 prueba en particular, eso no es un problema. Pero sería más útil tener un simulacro global porque lo uso mucho.
Según la documentación mock
:
El parche se puede utilizar como un decorador de la clase TestCase. Funciona mediante la decoración de cada método de prueba en la clase. Esto reduce el código repetitivo cuando sus métodos de prueba comparten un conjunto de parches comunes.
Básicamente, esto significa que puede crear una clase de prueba base con el decorador @patch
aplicado que @patch
sus llamadas externas mientras se ejecutan todos los métodos de prueba internos.
Además, puede usar los métodos del setUp()
start()
y stop()
los métodos setUp()
y tearDown()
respectivamente:
class BaseTestCase(TestCase):
def setUp(self):
self.patcher = patch(''mymodule.foo'')
self.mock_foo = self.patcher.start()
def tearDown(self):
self.patcher.stop()
Solo para agregar a la respuesta de alecxe , si está usando teardown()
entonces de acuerdo con los documentos
debe asegurarse de que los parches se "deshacen" llamando a
stop
. Esto puede ser más delicado de lo que usted podría pensar, porque si se produce una excepción en lasetUp
, no se llama atearDown
.
Si se produce una excepción en sus pruebas, no se desharán los parches. Una mejor manera sería llamar a addCleanup()
dentro de su setUp()
. Entonces puedes omitir el método tearDown()
completo.
class BaseTestCase(TestCase):
def setUp(self):
self.patcher = patch(''mymodule.foo'')
self.mock_foo = self.patcher.start()
self.addCleanup(self.patcher.stop) # add this line