Python-Mock, der in einer Klasse mit zwei verschiedenen Dateien 'geöffnet' wurde
Ich habe Probleme, herauszufinden, wie zwei Dateiöffnungen in einer Klasse verspottet werden, wenn beide Kontext-Manager verwenden. Ich weiß, wie es mit dem Mock-Modul für eine kontextverwaltete Datei gemacht wird:
@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')
Mein Problem ist, wie das gemacht wird, wenn eine Klasse zwei verschiedene Dateien im selben Aufruf öffnet. In meinem Fall ist die Klasse__init__()
lädt die Dateien in zwei Maps vor. Diese Klasse wird in anderen Klassen verwendet. Ich möchte das Laden dieser beiden Dateien verspotten, um meine Testdaten bereitzustellen, damit die anderen Klassen, die das IfAddrConfig-Objekt verwenden, mit meinem vorinstallierten Inhalt der Testdatei getestet werden können.
Hier ist ein Beispiel für die Klasse, mit der ich zu kämpfen habe: Lädt zwei Dateien in__init__()
, beide, die ich verspotten möchte, um meinen Test injizierten Akteninhalt zu laden. getInterfaceMap () ist die Funktion, die häufig aufgerufen wird, damit ich nicht möchte, dass die Dateien bei jedem Aufruf geladen und analysiert werden, daher der Grund für das Vorladen der Maps in__init__()
Einmal
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