Burlarse de toda la clase de python

Estoy tratando de hacer una prueba simple en python, pero no soy capaz de averiguar cómo llevar a cabo el proceso de burla.

Este es el código de clase y def:

class FileRemoveOp(...) @apply_defaults def __init__( self, source_conn_keys, source_conn_id='conn_default', *args, **kwargs): super(v4FileRemoveOperator, self).__init__(*args, **kwargs) self.source_conn_keys = source_conn_keys self.source_conn_id = source_conn_id def execute (self, context) source_conn = Connection(conn_id) try: for source_conn_key in self.source_keys: if not source_conn.check_for_key(source_conn_key): logging.info("The source key does not exist") source_conn.remove_file(source_conn_key,'') finally: logging.info("Remove operation successful.") 

Y esta es mi prueba para la función de ejecución:

 @mock.patch('main.Connection') def test_remove_execute(self,MockConn): mock_coon = MockConn.return_value mock_coon.value = #I'm not sure what to put here# remove_operator = FileRemoveOp(...) remove_operator.execute(self) 

Ya que el método de ejecución intenta hacer una conexión, necesito burlarme de eso, no quiero hacer una conexión real, simplemente devolver algo falso. ¿Cómo puedo hacer eso? Estoy acostumbrado a hacer pruebas en Java, pero nunca lo hice en Python.

    Primero, es muy importante entender que siempre debe simularse donde se usa lo que está intentando simular, tal como se indica en la documentación de unittest.mock .

    El principio básico es que usted parchea donde se busca un objeto, que no es necesariamente el mismo lugar donde se define.

    A continuación, lo que debería hacer es devolver una instancia de MagicMock como return_value del objeto parchado. Entonces, para resumir esto, necesitarías usar la siguiente secuencia.

    • Parche de objeto
    • preparar MagicMock para ser utilizado
    • devuelve el MagicMock que acabamos de crear como return_value

    Aquí un ejemplo rápido de un proyecto.

    connection.py (Clase que nos gustaría simular)

     class Connection(object): def execute(self): return "Connection to server made" 

    file.py (donde se usa la clase)

     from project.connection import Connection class FileRemoveOp(object): def __init__(self, foo): self.foo = foo def execute(self): conn = Connection() result = conn.execute() return result 

    tests / test_file.py

     import unittest from unittest.mock import patch, MagicMock from project.file import FileRemoveOp class TestFileRemoveOp(unittest.TestCase): def setUp(self): self.fileremoveop = FileRemoveOp('foobar') @patch('project.file.Connection') def test_execute(self, connection_mock): # Create a new MagickMock instance which will be the # `return_value` of our patched object connection_instance = MagicMock() connection_instance.execute.return_value = "testing" # Return the above created `connection_instance` connection_mock.return_value = connection_instance result = self.fileremoveop.execute() expected = "testing" self.assertEqual(result, expected) def test_not_mocked(self): # No mocking involved will execute the `Connection.execute` method result = self.fileremoveop.execute() expected = "Connection to server made" self.assertEqual(result, expected)