Ich habe eine Datenzugriffsklasse, die die Daten aus der Datenbank abruft. Es ist als ein Mix implementiert, d. H. ReferenceData, ich möchte diese Klasse mit der MockReferenceData-Klasse austauschen, so dass ich im Komponententest nicht auf die DB zugreifen muss. Aber funktioniert nicht.Ersetzen Sie eine Python-Mixin-Klasse zur Laufzeit
* Hinweis: Ich kann die Abhängigkeitsinjektion nicht verwenden. Da das Team es nicht verwenden möchte, wird es eine sehr große Codeänderung geben. Also ich suche, Mixin zur Laufzeit zu ersetzen.
class MockReferenceData(object):
def dbName(self):
return 'mock'
def totalNumberOfSeats(self):
return '10'
class ReferenceData(object):
def dbName(self):
return 'real DB'
def totalNumberOfSeats(self):
return 'Fetch from DB'
class Car(ReferenceData):
def showNumberOfSeats(self):
print self.totalNumberOfSeats()
class Train(ReferenceData):
def showNumberOfSeats(self):
print self.totalNumberOfSeats()
c = Car()
c.showNumberOfSeats()
t = Train()
t.showNumberOfSeats()
def extend_instance(obj, cls):
"""Apply mixins to a class instance after creation"""
base_cls = obj.__class__
base_cls_name = obj.__class__.__name__
obj.__class__ = type(base_cls_name, (base_cls, cls),{})
extend_instance(c, MockReferenceData)
c.showNumberOfSeats() // output now should be 10
Out Put ist:
Fetch from DB
Fetch from DB
Fetch from DB
ich gehofft wurde, wie ich extend_instance Methode verwendet haben, um neue verspott Klasse Ausgang zu zeigen sein wird:
Fetch from DB
Fetch from DB
10
Hallo Deets, Problem ist Code-Basis ist sehr alt und sehr groß. Ich habe gebeten, DI zu verwenden, aber das Team ist nicht bereit, es zu verwenden. Also versuche ich Mixin zur Laufzeit zu ändern. Ist es möglich? – Rahul
@Rahul wie Sie gesehen haben, ist es möglich. Ich würde es immer noch nicht tun.Wenn Sie Ihre Klassen so modifizieren, können Sie sich auf alle Arten von schwer zu debuggenden Problemen einstellen. Wenn dein Team darauf besteht, bestehen sie darauf, etwas Schlechtes zu tun. Eine andere Möglichkeit, Ihr Problem zu lösen, wäre, eine Unterklasse des Autos zu erstellen, die sowohl vom Mixin als auch vom ursprünglichen Auto erbt. Dies ist sicherer, da es eine explizite Klasse erstellt, anstatt den globalen Interpreterstatus zu ändern. – deets
Dank @deets, ich stimme zu, es ist nicht der sauberste Weg. Aber wenn das Team nicht will, habe ich keine Optionen. Auch wenn wir die Klasse im Unit-Test so erweitern, denke ich, dass sie keine Auswirkungen haben wird, da wir Objekte im Setup erstellen und im Teardown zerstören. Was denken Sie? – Rahul