unit tests mock python unit-testing mocking patch typeerror

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