Die Produktionsdatei (production_file.py) ist:python3 Mock funktioniert nicht für alle Pfade
class MyError(Exception):
pass
class MyClass:
def __init__(self):
self.value = None
def set_value(self, value):
self.value = value
def foo(self):
raise RuntimeError("error!")
class Caller:
def bar(self, smth):
obj = MyClass()
obj.set_value(smth)
try:
obj.foo()
except MyError:
pass
obj.set_value("str2")
obj.foo()
Testdatei (test.py):
import unittest
from unittest.mock import patch
from unittest.mock import call
from production_file import MyClass, Caller
class MyTest(unittest.TestCase):
def test_caller(self):
with patch('production_file.MyClass', autospec=MyClass) as MyClassMock:
my_class_mock_obj = MyClassMock.return_value
my_class_mock_obj.foo.side_effect = [MyError("msg"), "text"]
caller = Caller()
caller.bar("str1")
calls = [call("str1"), call("str2")]
my_class_mock_obj.set_value.assert_has_calls(calls)
if __name__ == '__main__':
unittest.main()
Diese oben genannten Arbeiten. Aber wenn ich mich bewege die Produktionsklassen (MyError, MyClass, Anrufer) in die Testdatei und Update-Patch an:
with patch('test.MyClass', autospec=MyClass) as MyClassMock:
dann die Instanz-Methode „foo“ nicht mehr verspottet.
Hat jemand eine Idee, warum das ist?
Ich habe auch ein ähnliches Problem mit etwas komplexeren Code, wo der Produktionscode in my_package/src/production_file.py ist, während der Test in my_package/tests/test_file.py ist. Python liefert keinen Fehler für den Pfad, der Pfad ist korrekt, aber der Mock funktioniert nicht.
Interessant ... aber warum nicht Python einen Fehler ergeben, wenn der Pfad falsch ist? – Feoggou
weil nichts schief läuft, wird nur an der falschen Stelle gepatcht, wenn Sie eine Datei 'test.py' haben und Sie darin' test importieren', dann haben Sie zwei Versionen derselben Datei, die mit unterschiedlichen Namen geladen sind. Wenn Sie 'if __name__ ==" __main__ "hinzugefügt haben: von Test Import MyClass ...' etc, würde es wie erwartet funktionieren, da es dann die Klasse, die Sie für den Test verwenden, patchen. –
Ich habe auch ein Problem mit einer komplizierteren Situation, wo ich my_package/src/my_file.py und my_package/tests/test.py habe. In diesem Fall verwendet einer meiner Tests einen Patch ("src.my_file.MyClass"), aber der Mock funktioniert trotzdem nicht. Gibt es eine Möglichkeit für mich, zu debuggen und zu protokollieren, was der Test eigentlich tut? – Feoggou