Python mock builtin 'abierto' en una clase usando dos archivos diferentes

Tengo problemas para descubrir cómo simular dos archivos abiertos en una clase cuando ambos usan administradores de contexto. Sé cómo hacerlo para un archivo administrado por contexto usando el módulo simulado como este:

@patch('__builtin__.open')
def test_interface_mapping(self, mock_config):
        m = MagicMock(spec=file)
        handle = m.return_value.__enter__.return_value
        handle.__iter__.return_value = ('aa', 'bb')

Mi problema es cómo hacer esto cuando una clase abre dos archivos diferentes en la misma llamada. En mi caso la clase__init__() precarga los archivos en dos mapas. Esta clase se usa en otras clases. Quiero burlarme de la carga de estos dos archivos para proporcionar mis datos de prueba para que las otras clases que usan el objeto IfAddrConfig puedan probarse contra el contenido de mi archivo de prueba precargado.

Aquí hay un ejemplo de la clase con la que estoy luchando que carga dos archivos en__init__(), los cuales quiero simular para cargar el contenido del archivo inyectado de prueba. getInterfaceMap () es la función que se llama con frecuencia, por lo que no quiero que se carguen y analicen los archivos en cada llamada, de ahí la razón para precargar los mapas en__init__() una vez.

class IfAddrConfig(object):
    def __init__(self):
        # Initialize the static maps once since they require file operations
        # that we do not want to be calling every time getInterfaceMap() is used
        self.settings_map = self.loadSettings()
        self.config_map = self.loadConfig()

    def loadConfig(self):
        config_map = defaultdict(dict)
        with open(os.path.join('some_path.cfg'), 'r') as stream:
            for line in stream:
                # Parse line and build up config_map entries
        return config_map

    def loadSettings(self):
        settings_map = {}
        with open('another_path.cfg', 'r') as stream:
            for line in stream:
                # Parse line and build up settings_map entries
        return settings_map

    def getInterfaceMap(self, interface):
        # Uses both the settings and config maps to finally create a composite map
        # that is returned to called
        interface_map = {}
        for values in self.config_map.values():
            # Accesss self.settings_map and combine/compare entries with
            # self.config_map values to build new composite mappings that
            # depend on supplied interface value
        return interface_map

Respuestas a la pregunta(3)

Su respuesta a la pregunta