Django test datei herunterladen – "ValueError: I / O-Operation auf geschlossene Datei"

Ich habe Code für eine Ansicht, die eine Datei-Download dient, und es funktioniert gut im Browser. Jetzt versuche ich, einen Test dafür zu schreiben, mit dem internen django Client.get:

response = self.client.get("/compile-book/", {'id': book.id}) self.assertEqual(response.status_code, 200) self.assertEquals(response.get('Content-Disposition'), "attachment; filename=book.zip") 

So weit, ist es gut. Jetzt möchte ich testen, ob die heruntergeladene Datei die ist, die ich erwarte, dass es heruntergeladen wird. Also fange ich an zu sagen:

  f = cStringIO.StringIO(response.content) 

Jetzt antwortet mein Testläufer mit:

 Traceback (most recent call last): File ".../tests.py", line 154, in test_download f = cStringIO.StringIO(response.content) File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 282, in content self._consume_content() File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 278, in _consume_content self.content = b''.join(self.make_bytes(e) for e in self._container) File "/home/epub/projects/epub-env/lib/python2.7/site-packages/django/http/response.py", line 278, in <genexpr> self.content = b''.join(self.make_bytes(e) for e in self._container) File "/usr/lib/python2.7/wsgiref/util.py", line 30, in next data = self.filelike.read(self.blksize) ValueError: I/O operation on closed file 

Auch wenn ich einfach: self.assertIsNotNone (response.content) bekomme ich den gleichen ValueError

Das einzige Thema auf dem gesamten Internet (einschließlich django docs) Ich könnte über das Testen von Downloads zu finden war dieses Stackoverflow Thema: Django Unit Test für das Testen eines Datei-Download . Der Versuch, diese Lösung zu führen, führte zu diesen Ergebnissen. Es ist alt und selten genug für mich, eine neue Frage zu öffnen.

Wer weiß, wie die Prüfung von Downloads in Django behandelt werden soll? (Btw, läuft django 1.5 auf python 2.7)

2 Solutions collect form web for “Django test datei herunterladen – "ValueError: I / O-Operation auf geschlossene Datei"”

Das funktioniert für uns. Wir geben rest_framework.response.Response aber es sollte auch mit regelmäßigen Django-Antworten funktionieren.

 import io response = self.client.get(download_url, {'id': archive_id}) downloaded_file = io.BytesIO(b"".join(response.streaming_content)) 

Hinweis: streaming_content ist nur für StreamingHttpResponse (auch Django 1.10) verfügbar: https://docs.djangoproject.com/de/1.10/ref/request-response/#django.http.StreamingHttpResponse.streaming_content

Ich hatte einige Datei Download-Code und einen entsprechenden Test, der mit Django 1.4 gearbeitet hat. Der Test ist fehlgeschlagen, als ich auf Django 1.5 aufgerüstet habe (mit demselben ValueError: I/O operation on closed file , den du angetroffen hast).

Ich habe es durch Ändern meiner Nicht-Test-Code, um eine StreamingHttpResponse anstelle einer Standard- HttpResponse . Mein Testcode verwendete response.content also habe ich zuerst zu CompatibleStreamingHttpResponse migriert und dann meinen Testcode Code geändert, um response.streaming_content stattdessen zu verwenden, um mir zu erlauben, CompatibleStreamingHttpResponse zugunsten von StreamingHttpResponse .

  • Bei der Verwendung von unittest.mock.patch, warum ist autospec nicht true standardmäßig?
  • Speziell benannte Verzeichnisse mit Nosetests
  • Einstellung pycharm laufen django unittest
  • Django / Python unittesting: Wie Force Exception of Try / Except Block zu erzwingen
  • Unbekannter Tkinter File Dialog
  • Einheit testet ganze Projekthierarchie in Python mit unittest in pydev
  • Wie gruppiere ich Unit-Tests in Django bei einer höheren Granularität als die App?
  • Wie man Argumente an ein UnitTest ohne globale Variablen sendet
  • Django Benutzer Setup für Nase Tests
  • Eine Liste aller Module im aktuellen Paket erhalten
  • Wie kann ich einen Redis-Client in Python verspotten?
  • Python ist die beste Programmiersprache der Welt.