In meiner Django-App habe ich eine Ansicht, die das Hochladen von Dateien ermöglicht. Das Kern-Snippet sieht so aus
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Ich möchte die Ansicht als Unit-Test testen. Ich plane, sowohl den Happy-Pfad als auch den Fail-Pfad zu testen. Dies ist der Fall, in dem request.FILES
der Schlüssel keine 'Datei' request.FILES['file']
hat None
.
Wie richte ich die Postdaten für den Happy Path ein? Kann mir jemand sagen?
django
unit-testing
file-upload
Damon
quelle
quelle
Antworten:
Ab Django-Dokumenten
Client.post
:quelle
integration test
- spielt eigentlich keine Rolle, bis Sie in komplexere Codebasen geraten, vielleicht sogar mit einem tatsächlichen TestteamFrüher habe ich das Gleiche getan,
with open('some_file.txt') as fp:
aber dann brauchte ich Bilder, Videos und andere echte Dateien im Repo. Außerdem habe ich einen Teil einer gut getesteten Django-Kernkomponente getestet. Derzeit habe ich Folgendes getan:In Python 3.5+ müssen Sie
bytes
stattdessen Objekt verwendenstr
. Wechseln Sie"file_content"
zub"file_content"
Es hat gut funktioniert,
SimpleUploadedFile
erstellt einenInMemoryFile
, der sich wie ein normaler Upload verhält, und Sie können den Namen, den Inhalt und den Inhaltstyp auswählen.quelle
"file_content"
der Fall ist , muss es sich um einen gültigen Bildheader handeln, damit Ihr Code denkt, dass es sich um ein gültiges Bild handelt.Ich empfehle Ihnen, sich Django RequestFactory anzusehen . Dies ist der beste Weg, um die in der Anfrage angegebenen Daten zu verspotten.
Sagte, ich habe mehrere Fehler in Ihrem Code gefunden.
Daher empfehle ich Ihnen, Ihre Ansicht umzugestalten , um eine Funktion wie die folgende zu verwenden:
Und verspotten Sie das. Sie können Python Mock verwenden .
PS: Sie könnten auch den Django Test Client verwenden. Dies würde jedoch bedeuten, dass Sie noch weitere Dinge zum Testen hinzufügen, da dieser Client Sitzungen, Middlewares usw. verwendet. Nichts Ähnliches wie Unit Testing.
quelle
profile_picture
, die intern eineupload_profile_picture
Funktion verwendet. Wenn Sie diese Ansicht testen möchten, verspotten Sie einfach die interne Funktion und stellen Sie sicher, dass sie bei Ihrem Test aufgerufen wird. Dies ist ein einfaches Beispiel: gist.github.com/santiagobasulto/6437356Ich mache so etwas für meine eigene ereignisbezogene Anwendung, aber Sie sollten mehr als genug Code haben, um mit Ihrem eigenen Anwendungsfall fortzufahren
quelle
Ich habe so etwas gemacht:
Die Funktion create_image erstellt ein Bild, sodass Sie keinen statischen Bildpfad angeben müssen.
Hinweis: Sie können den Code gemäß Ihrem Code aktualisieren. Dieser Code für Python 3.6.
quelle
In Django 1.7 gibt es ein Problem mit dem TestCase, das mit open (Dateipfad, 'rb') behoben werden kann. Bei Verwendung des Testclients haben wir jedoch keine Kontrolle darüber. Ich denke, es ist wahrscheinlich am besten sicherzustellen, dass file.read () immer Bytes zurückgibt.
Quelle: https://code.djangoproject.com/ticket/23912 , von KevinEtienne
Ohne die Option rb wird ein TypeError ausgelöst:
quelle
quelle
Wie in der offiziellen Dokumentation von Django erwähnt :
Weitere Informationen: Wie kann ich überprüfen, ob die Datei als Argument an eine Funktion übergeben wird?
Während des Testens möchten wir manchmal sicherstellen, dass die Datei als Argument an eine Funktion übergeben wird.
z.B
Verwenden Sie in Tests Pythons Mock ungefähr so:
quelle
Hoffe das hilft.
quelle
Ich benutze Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Ich habe es versucht,
self.client.post
aber eine bekommenResolver404
Ausnahme bekommen.Folgendes hat bei mir funktioniert:
quelle