Ich versuche, ein Viele-zu-Viele-Szenario mit peewee python ORM zu implementieren, und ich möchte einige Komponententests. Peewee tutorial ist großartig, aber es geht davon aus, dass die Datenbank auf Modulebene definiert ist, dann verwenden alle Modelle es. Meine Situation ist anders: Ich habe keine Quellcodedatei (ein Modul aus Pythons Sicht) mit Tests, die ich explizit ausführe, ich benutze nose, die Tests aus dieser Datei sammelt und sie ausführt.
Wie verwende ich eine benutzerdefinierte Datenbank nur für Modelle instanziiert in Tests (die von Nase ausgeführt werden)? Mein Ziel ist es, eine In-Memory-Datenbank nur für Tests zu verwenden, um den Testprozess zu beschleunigen.
Ich habe heute ein Commit gemacht, das macht das einfacher.
Das Update hat die Form eines Kontextmanagers, mit dem Sie die Datenbank eines Modells überschreiben können:
%Vor%Lesen Sie die Dokumentation und werfen Sie einen Blick auf die Beispiel-Testfälle :
Ich habe die großartigen Antworten von @colifer und @avalanchy genommen und einen Schritt weiter gegangen.
Um zu vermeiden, dass die run-Methode für jede TestCase
-Unterklasse überschrieben wird, können Sie eine Basisklasse verwenden ... und ich mag auch die Idee, nicht jede Modellklasse I aufschreiben zu müssen arbeiten mit, so kam ich mit diesem
Also, jetzt kann ich einfach von TestCaseWithPeewee
erben und muss mich um nichts anderes als den Test kümmern
Bei der Verwendung von test_database
sind Probleme aufgetreten, weil test_db
nicht initialisiert wurde:
nose.proxy.Exception: Error, database not properly initialized before opening connection
-------------------- >> begin captured logging << --------------------
peewee: DEBUG: ('SELECT "t1"."id", "t1"."name", "t1"."count" FROM "counter" AS t1', [])
--------------------- >> end captured logging << ---------------------
Ich habe das schließlich behoben, indem ich create_tables=True
like so übergeben habe:
def test_timeline(self):
with test_database(test_db, (User, Tweet), create_tables=True):
# This data will be created in 'test_db'
self.create_test_data()
Nach sollten die Dokumente create_tables
standardmäßig auf% gesetzt werden co_de%, aber das scheint in der neuesten Version von True
nicht der Fall zu sein.