2016-07-19 9 views
3

Ich bin offen für Mock-Datei versucht, und alle Beispiele zeigen, dass ich zuMock-Datei öffnen in Python

@patch('open', create=True) 

brauchen, aber ich bekomme immer wieder

Need a valid target to patch. You supplied: 'open' 

Ich weiß Patch auf die Bedürfnisse voller gepunkteter Pfad von open, aber ich habe keine Ahnung, was es ist. Ich bin mir nicht einmal sicher, ob das das Problem ist.

+1

1. Aus Was Sie gepostet haben, können wir Ihnen nicht sagen, was der Pfad sein sollte, oder wenn das das Problem ist. Gib ein [mcve]. 2. Sie wissen, dass es ['mock_open'] (https://docs.python.org/3/library/unittest.mock.html#mock-open) speziell dafür gibt? – jonrsharpe

Antwort

9

Sie müssen einen Modulnamen angeben. wenn Sie in einem Skript testen, ist der Name des Moduls __main__:

@patch('__main__.open') 

sonst den Namen des Moduls verwenden, die den Code enthält, die Sie testen:

@patch('module_under_test.open') 

so dass jeder Code, Verwendet das eingebaute open() wird stattdessen das gepatchte globale finden.

Beachten Sie, dass das mock Modul mit einem mock_open() utility kommt, dass Sie einen geeigneten open() Anruf mit Dateidaten aufbauen lasse:

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n')) 
+0

Eine weitere Frage: Könnte ein solcher Mock (mit spezifizierten Rückgabewerten) als Kontextmanager (innerhalb einer 'with' Anweisung) verwendet werden? – 0xc0de

+0

@ 0xc0de: Ja, die Dokumentation, zu der ich verlinke, enthält Beispiele von 'open()', die mit einer 'with'-Anweisung verwendet und mit' mock_open() 'gepatcht werden. –

+0

Ja, ich sah es später, nachdem ich hier gefragt habe. Vielen Dank. – 0xc0de

1

In Python 3 sollten Sie verwenden:

@mock.patch("builtins.open", create=True)