2016-02-23 6 views
5

Ich versuche, eine Klasse zu patchen, die von der Klasse, die ich testen möchte, instanziiert wird, aber es funktioniert nicht. Ich habe die verschiedenen Dokumente gelesen, aber immer noch nicht gefunden, was ich falsch mache. Hier ist der Code-Schnipsel:Patch-Klasse, die von der getesteten Klasse instanziiert wurde, kann nicht mit Unittest verwendet werden

In tests/Test.py:

from module.ClassToTest import ClassToTest 

class Test(object): 

    @mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 
    def setUp(self, my_class_mock): 
     self.instance = my_class_mock.return_value 
     self.instance.my_method.return_value = "def" 
     self.class_to_test = ClassToTest() 

    def test(self): 
     val = self.class_to_test.instance.my_method() #Returns 'abc' instead of 'def' 
     self.assertEqual(val, 'def') 

In module/ClassToPatch.py:

class ClassToPatch(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     return "abc" 

In module/ClassToTest.py:

from module.ClassToPatch import ClassToPatch 

class ClassToTest(object): 
    def __init__: 
     # Still instantiates the concrete class instead of the mock 
     self.instance = ClassToPatch() 

ich in diesem Fall weiß ich leicht die injizieren könnte Abhängigkeit, aber das ist nur ein Beispiel. Außerdem verwenden wir eine Richtlinie für einzelne Klassen pro Datei, wobei die Datei wie die Klasse benannt ist, daher die seltsame Importbenennung.

+2

Versuchen Sie @ mock.patch ('module.ClassToTest.ClassToPatch', autospec = False) –

+0

In der Zukunft, machen Sie bitte Ihren Beispielcode ein [MCVE] (http://stackoverflow.com/help/mcve); Es gab mehrere Fehler in Ihrem geposteten Code und Sie können sich nicht darauf verlassen, dass jemand mit dem Problem vertraut ist, um das Problem sofort zu erkennen und eine Lösung anzubieten. –

+0

Ok, ich nehme es zur Kenntnis – sixtstorm1

Antwort

1

Wie norbert erwähnt, ist das Update von der Mock Linie zu ändern

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 

zu

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False) 

According to the docs:

Der Patch() Dekorateur/Kontext-Manager macht es Einfaches Nachstellen von Klassen oder Objekten in einem zu testenden Modul. Das von Ihnen angegebene Objekt wird während des Tests durch ein Pseudo-Objekt (oder ein anderes Objekt) ersetzt und am Ende des Tests wiederhergestellt.

Sie testen den ClassToTest Modul, nicht die ClassToPatch Modul.

Verwandte Themen