Lassen Sie uns sagen, ich habe ein Article
Modell, wie folgt aus:Komponententest prüft, ob Datenbankabfragen korrekt sind - was kann man spotten?
from django.db import models
class Article(models.Model):
author = models.CharField(max_length=100)
title = models.CharField(max_length=200)
body = models.TextField()
Diese Naivität ist einfach im Vergleich zu meinem tatsächlichen Nutzung (author
ein ForeignKey
auf ein anderes Modell sein sollte, etc.), aber auf diese Weise ist es klarer.
Stellen Sie sich vor, ich möchte die Titel aller Artikel von bestimmten Autoren auflisten, aber die Stücke jedes Autors zusammenhalten. Man könnte es als eine Liste von Listen dargestellt werden:
def get_beatles_articles_titles():
beatles = [
"John Lennon",
"Paul McCartney",
"George Harrison",
"Ringo Starrr",
]
return [article.author for author in beatles
for article in Article.objects.filter(author=author)]
Oh, eine verschachtelte Liste Verständnis, so dass unsere Methode nicht so einfach ist. Es besteht die große Chance, dass sich irgendwo ein Bug befindet, also sollten wir es irgendwie testen! Die einfachste Lösung scheint darin zu bestehen, einige Article
Instanzen zu erstellen, die jedem Autor entsprechen (und sie in der Datenbank zu speichern) und zu überprüfen, ob alle von ihnen korrekt abgerufen wurden.
Mit diesem Test können wir sehen, dass es einen Tippfehler in unserem ursprünglichen Code gibt, also hat es sich als nützlich erwiesen.
Der Zugriff auf die Datenbank ist jedoch verpönt zugunsten der Spott der Dinge (kein Wunder, ich habe erlebt, dass Zeitunterschied kann erheblich sein). Was kann im obigen Test verspottet werden? Ich bin besonders besorgt über die Korrektheit meiner .filter
Abfrage (es könnte ziemlich komplex werden), so will ich nicht QuerySet
s sähen, würde mir eine DB geben.
Idealerweise würde Ich mag so etwas wie dieses verwenden (Pseudo-Code folgt):
johns_article = Article(author="John Lennon")
fake_query = MockQuery(author__contains="John")
assertTrue(fakeQuery.contains(johns_article))
Danke für die Erinnerung an 'bulk_create'. Ehrlich gesagt, ich möchte eine solche Funktion irgendwann sehen, aber danke für die Erklärung, warum es nicht so viel ist! – Szymon