Frage Die Klasse, die von der getesteten Klasse mithilfe von Unittest instanziiert wurde, kann nicht gepatcht werden


Ich versuche, eine Klasse zu patchen, die von der Klasse, die ich testen möchte, instanziiert wurde, aber es funktioniert nicht. Ich habe die verschiedenen Dokumente gelesen, aber immer noch nicht gefunden, was ich falsch mache. Hier ist das Code-Snippet:

Im 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')

Im module/ClassToPatch.py:

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

Im 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 weiß, in diesem Fall könnte ich die Abhängigkeit leicht injizieren, 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.


5
2018-02-23 20:36


Ursprung


Antworten:


Wie norbert erwähnt, besteht die Lösung darin, die Scheinlinie zu ändern

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

zu

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

Laut den Unterlagen:

Der patch () Decorator / Context Manager macht es einfach, Klassen oder Objekte in einem getesteten Modul nachzuahmen. 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 die ClassToTest Modul, nicht die ClassToPatch Modul.


2
2018-03-08 16:52