Seite 1 von 1
In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Samstag 23. Januar 2016, 20:56
von jens
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?
Re: In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Samstag 23. Januar 2016, 21:19
von 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.
Re: In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Samstag 23. Januar 2016, 21:47
von pillmuncher
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.
Re: In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Sonntag 24. Januar 2016, 00:29
von jens
pillmuncher hat geschrieben:Oder IO nach außen schieben, damit man sowas gar nicht erst testen muss.
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.
Ich mache mich mal an mock ran...
Re: In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Sonntag 24. Januar 2016, 01:01
von 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.

Re: In unitests simulieren, das open() oder os.link() Fehlschlägt?
Verfasst: Sonntag 24. Januar 2016, 01:47
von jens
Hab was ich wollte...
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)
Komme ich in meiner ersetzenden Funktion auch ohne
origin_open und
origin_os_link an die originalen wieder herran?!?