Intento usar mock
para escribir algunas pruebas de unidad en python.Cómo simular una clase base con la biblioteca de simulacro de pitón
Por ejemplo, tengo la clase siguiente:
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
Y sólo quieren probar el método handle
. Sin tener que asumir nada sobre socketserver.BaseRequestHandler
. Por ejemplo, quiero afirmar que handle
llama al recv
con el argumento 1024
. ¿Es posible hacer tal cosa con simulacro? Es decir. reemplazando la clase base socketserver.BaseRequestHandler
con un simulacro? ¿O estoy desviado de esa idea?
Con la respuesta de ecatmur (¡gracias!) Intentó por primera vez el siguiente:
patcher = patch.object(TCPHandler, '__bases__', (Mock,))
with patcher:
patcher.is_local = True
handler = TCPHandler()
handler.handle()
Pero ahora handle
no se llama anylonger y dir(handler)
da:
['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
type(handler)
da <class 'mock.TCPHandler'>
Lo que interpreto que parchear la clase base también convierte mi clase derivada en una simulación.
ahora me dio otra idea intentarlo:
mock = MagicMock()
TCPHandler.handle(mock)
#assertions
Sin embargo la maqueta parece no ser llamado.
Seguí tu sugerencia pero la consecuencia fue que también el método de la clase derivada se reemplazó por el simulacro. –
Puse mi código de prueba actual en la pregunta, si es que podría echar un vistazo? Aprecio tu ayuda. –
@FrederickRoth no está demasiado seguro; funciona bien para mí con Python 2. ¿Quizás intente burlarse de las partes del objeto al que accede el método? – ecatmur