In unitests simulieren, das open() oder os.link() Fehlschlägt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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. :-)
Benutzeravatar
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:

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?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten