Hat jemand eine Idee, wie ich in unittests simulieren kann, das ein os.link() einen Fehler wirft?!?
os.link() per Monkey-Patch ändern?!?
Oder simulieren, das eine existierende Datei nicht per open() geöffnet werden kann?
EDIT: Evtl. kann https://docs.python.org/dev/library/unittest.mock.html (neu in Python 3.3) hier helfen... aber wie?
In unitests simulieren, das open() oder os.link() Fehlschlägt?
-
BlackJack
@jens: Du suchst wahrscheinlich `mock.patch()`.
Dieses Modul gibt es ja schon etwas länger. Das habe ich glaube ich sogar schon in Python 2.4 verwendet. Neu ist nur, dass es ab Python 3.3 in der Standardbibliothek ist.
Dieses Modul gibt es ja schon etwas länger. Das habe ich glaube ich sogar schon in Python 2.4 verwendet. Neu ist nur, dass es ab Python 3.3 in der Standardbibliothek ist.
- pillmuncher
- User
- Beiträge: 1532
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Oder IO nach außen schieben, damit man sowas gar nicht erst testen muss. Mehr dazu sagt Brandon Rhodes hier auf Youtube: The Clean Architecture in Python.
In specifications, Murphy's Law supersedes Ohm's.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich will ja testen, was passiert, wenn die IO nicht so funktioniert wie erwartet... Also von daher muß ich simulieren, das ein open() fehlschlägt.pillmuncher hat geschrieben:Oder IO nach außen schieben, damit man sowas gar nicht erst testen muss.
Ich mache mich mal an mock ran...
-
BlackJack
@pillmuncher: Dateioperationen ganz nach aussen zu verschieben (in Uncle Bob's Ringmodell) erscheint mir ein bisschen schwierig wenn die Entities in der Anwendung, also die Mitte im Diagramm, Dateien und Verzeichnisse sind, und die Geschäftslogik sich um das kopieren eben jener dreht. Es geht hier ja sehr wahrscheinlich um die Backupsoftware an der jens gerade werkelt. 
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab was ich wollte...
Allerdings hab ich hierzu eine Frage:
Komme ich in meiner ersetzenden Funktion auch ohne origin_open und origin_os_link an die originalen wieder herran?!?
Allerdings hab ich hierzu eine Frage:
Code: Alles auswählen
origin_os_link = os.link
def patched_open(source, link_name):
if source.endswith("root_file_B.txt"):
raise IOError("unittests raise")
return origin_os_link(source, link_name)
with mock.patch('os.link', patched_open):
result = self.invoke_cli("backup", self.source_path)
...
origin_open = open
def patched_open(filepath, mode, *args, **kwargs):
if filepath in (filepath1,filepath2):
raise IOError("unittests raise")
return origin_open(filepath, mode, *args, **kwargs)
with mock.patch('builtins.open', patched_open):
result = self.invoke_cli("backup", self.source_path)