Python mock, встроенный в класс с использованием двух разных файлов

У меня возникают проблемы с выяснением, как имитировать два открытия файлов в классе, когда они оба используют диспетчеры контекста. Я знаю, как сделать это для одного файла с контекстным управлением, используя модуль mock, как это:

@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')

Моя проблема заключается в том, как это сделать, когда класс открывает два разных файла в одном вызове. В моем случае класс__init__() предварительно загружает файлы в две карты. Этот класс используется в других классах. Я хочу смоделировать загрузку этих двух файлов, чтобы предоставить мои тестовые данные, чтобы другие классы, использующие объект IfAddrConfig, могли быть протестированы с моим предварительно загруженным содержимым тестового файла.

Вот пример класса, с которым я борюсь, который загружает два файла в__init__(), оба из которых я хочу издеваться, чтобы загрузить мой тестовый ввод содержимого файла. getInterfaceMap () - это функция, которая часто вызывается, поэтому я не хочу, чтобы она загружала и анализировала файлы при каждом вызове, поэтому причина предварительной загрузки карт в__init__() один раз.

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

Ответы на вопрос(3)

Ваш ответ на вопрос