2016-11-28 3 views
1

ich die folgenden Dateien:Wie eine Klasse verspotten, damit es nicht auf Import läuft

test_temp.py:

import pytest 
from mock import patch 

with patch('temp.TheEvilClass'), patch('temp2.TheEvilClass'): 
    from temp import TempClass 


def test_evil(): 
    assert True 

temp.py:

from temp2 import TheEvilClass 

class TempClass(object): 
    TheEvilClass() 

temp2.py:

class TheEvilClass(object): 
    print "I'm evil! ]:>" 
    raise Exception 

Mein ich Intention war für den Patch in test_temp.py, TheEvilClass zu verspotten, so dass die Ausnahme nie aufgerufen wird. Ich habe versucht, es an beiden Orten zu patchen, aber die Ausnahme wird immer noch geworfen. Haben Sie irgendwelche Hinweise darauf, was ich falsch mache und wie man temp.py testen kann, ohne jemals die tatsächliche TheEvilClass auszulösen? Ich habe versucht, das ganze Modul zu verspotten (mit patch('temp2')), aber das scheint auch nicht zu funktionieren.

+2

Sie können nicht, Sie Patch * nach * importieren. Stattdessen sollten Sie 'temp2' neu gestalten, um beim Import nichts zu tun. – jonrsharpe

+1

Ich stimme nicht mit @jonrsharpe überein, Sie möchten nicht unbedingt ändern, wie der Code nur für Testzwecke funktioniert. Es ist wahrscheinlicher, dass die Umgebung richtig eingerichtet werden muss, damit Importe nicht fehlschlagen. – wim

+0

Leider kann ich mit temp2 nichts anfangen, da es ein externes Modul ist. – iknownothing

Antwort

1

Was Sie versuchen, ist mit mock nicht möglich, weil es der Patch selbst ist, der den Import auslöst. patch ruft _get_target auf, die _importer verwendet, die __import__ aufruft.

https://github.com/testing-cabal/mock/blob/master/mock/mock.py#L1206

Eine einfachere Art und Weise direkt auf den Patch, indem das ist nur zu sehen:

patch('temp.TheEvilClass').__enter__() 

Der richtige Weg, um darüber zu gehen, ist die Testumgebung so einzurichten, dass nicht behandelte Ausnahmen aren‘ t wird zur Zeit der Einfuhr angehoben.

+0

Wie wird der Patch direkt angewendet? Ich bekomme nicht ganz das, was ich erreiche, indem ich das __enter __() des Patches anrufe, nachdem es sowieso aufgerufen wurde. Und mit "Einrichten der Testumgebung" meinen Sie nur die Ausnahme zu unterdrücken? – iknownothing

+2

Ich meine, wenn Sie den Patch überhaupt verwenden (entweder durch direkten Aufruf von '__enter__' oder durch Verwendung einer 'with'-Anweisung), sehen Sie die Ausnahme trotzdem, weil * es die Patch-Aktion ist, die den Code * importiert. Wenn Sie stattdessen die Zeile 'from temp import TempClass' in' test_temp.py' mit 'pass' ersetzen, werden Sie verstehen, was ich beschreibe. Das ist ein XY-Problem - der richtige Ansatz besteht darin, eine Testumgebung so einzurichten, dass die Laufzeitumgebung so gut nachgebildet wird, dass dieser Code beim Import nicht ausfällt. – wim

Verwandte Themen