Ich versuche, einige Unittests für eine Klasse zu schreiben, die von einem anderen abgeleitet ist, aber ich habe einige Schwierigkeiten der übergeordneten Klasse init Methode zu verspotten, die afaik Sie können nicht, so ich suche Vorschlag .Mock Elternklasse __init__ Methode
Hier ist ein Beispiel dafür, wie sind meine Klassen
Imported.py
class Imported():
def __init__(self, a="I am Imported"):
print("a:{}".format(a))
Parent.py
from Imported import Imported
class Parent(object):
parent_list = ["PARENT"]
def __init__(self, a="I am Parent"):
imported = Imported(a)
Derived.py
from Parent import Parent
class Derived(Parent):
Parent.parent_list.append("DERIVED")
In meiner Unittests I will das verifizieren Parent.parent_list == ["PARENT", "DERIVED"], wenn ich ein Objekt aus der Derived-Klasse Derived() instanziiere.
funktioniert
test_Derived.py Beide dieser Lösung nicht
import unittest
from mock import patch
from Derived import Derived
class test_Derived(unittest.TestCase):
@patch("Derived.Parent.__init__")
def test_init_001(self, mock_parent_init):
a = Derived("I am Derived")
mock_parent_init.assert_called_with("I am Derived")
self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])
@patch("Derived.Imported.Imported")
def test_init_002(self, mock_parent_init):
a = Derived("I am Derived")
mock_parent_init.assert_called_with("I am Derived")
self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])
test_init_001 mit
TypeError: __init__() should return None, not 'MagicMock'
test_init_002 nicht mit
ImportError: No module named Parent.Imported
Alle s nicht Uggestion?
Warum genau funktioniert 'Eltern .__ init__' verspottet werden? Warum nicht einfach "Importiert" vortäuschen? –
Ihr zweiter Test muss "Parent.Imported" vortäuschen. –
Zu guter Letzt haben Sie 'Parent.parent_list' * in place * geändert, sodass sich sowohl 'Parent.parent_list' als auch' Derived.parent_list' auf dasselbe Objekt beziehen. Also 'Parent.parent_list' enthält jetzt" "Derived" ". Wahrscheinlich möchten Sie stattdessen eine Kopie für "Derived" erstellen: 'parent_list = Parent.parent_list + [" DERIVED "]'. Ihre Tests könnten dies überprüfen. –