python - tests - mock install
Parche: ¿Parchear la clase introduce un parámetro extra? (2)
Patch pasa una instancia del objeto parcheado a su método de prueba (o a cada método de prueba si está parcheando en el nivel de clase). Esto es útil porque le permite establecer valores de retorno y efectos secundarios, o verificar las llamadas realizadas
@patch(''some_module.sys.stdout'')
def test_something_with_a_patch(self, mock_sys_stdout):
mock_sys_stdout.return_value = ''My return value from stdout''
my_function_under_test()
self.assertTrue(mock_sys_stdout.called)
self.assertEqual(output, mock_sys_stdout.return_value)
Si solo quieres parchear algo para ignorarlo, puedes llamar al parche con la siguiente invocación
@patch(''some_module.sys.stdout'', Mock())
def test_something_with_a_patch(self):
Eso reemplaza sys.stdout en el some_module con un objeto simulado y no lo pasa al método.
Primera vez usando parche. Intenté parchar una de mis clases para probarla. Sin el parche que intenta ejecutarse pasa la definición de la función de prueba, pero con el parche la definición de la función de prueba aparentemente requiere otro parámetro y obtengo una
TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given)
Error. El código de prueba es el siguiente:
import unittest
import mock
from notification.models import Channel, addChannelWithName, deleteChannelWithName
class TestChannel(unittest.TestCase):
@mock.patch(''notification.models.Channel'')
def testAddChannelWithNamePutsChannel(self):
addChannelWithName(''channel1'')
Channel.put.assert_called_with()
¿Por qué requiere un parámetro adicional con el parche y qué debería ser este parámetro? ¡Muchas gracias!
patch
pasa el objeto parcheado a la función de prueba. Está documentado aquí :
parche como decorador de funciones, creando el simulacro para usted y pasándolo a la función decorada:
>>> >>> @patch(''__main__.SomeClass'') ... def function(normal_argument, mock_class): ... print(mock_class is SomeClass) ... >>> function(None) True