Ich versuche Tests für einige Modelle zu erstellen, die ein FileField haben. Das Modell sieht wie folgt aus:Django Test FileField mit Test Fixtures
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
ich zwei Probleme haben:
Wenn an einer Halterung zum Speichern von Daten
./manage.py dumpdata
verwenden, werden die Dateiinhalte nicht gespeichert, wird nur der Dateiname wird in die gespeicherte Leuchte. Während ich finde, dass dies das erwartete Verhalten ist, da die Dateiinhalte nicht in der Datenbank gespeichert werden, möchte ich diese Informationen irgendwie in das Gerät für Tests einbeziehen.Ich habe einen Testfall für Hochladen einer Datei, die wie folgt aussieht:
def test_post_solution_file(self): import tempfile import os filename = tempfile.mkstemp()[1] f = open(filename, 'w') f.write('These are the file contents') f.close() f = open(filename, 'r') post_data = {'file': f} response = self.client.post(self.solution.get_absolute_url()+'add_solution_file/', post_data, follow=True) f.close() os.remove(filename) self.assertTemplateUsed(response, 'tests/solution_detail.html') self.assertContains(response, os.path.basename(filename))
Während dieser Test funktioniert gut, es lässt die hochgeladene Datei im Medienverzeichnis nach Fertigstellung. Natürlich konnte die Löschung in tearDown()
erledigt werden, aber ich fragte mich, ob Django einen anderen Weg hatte, damit umzugehen.
Eine Lösung, an die ich dachte, war die Verwendung eines anderen Medienordners für Tests, die mit den Testvorrichtungen synchronisiert werden müssen. Gibt es eine Möglichkeit, ein anderes Medienverzeichnis in anzugeben, wenn Tests ausgeführt werden? Und kann ich eine Art Hook zu dumpdata hinzufügen, damit die Dateien in den Medienordnern synchronisiert werden?
Gibt es also eine mehr Pythonic oder Django-spezifische Art des Umgangs mit Komponententests mit Dateien?
So os.remove (foo) does't Arbeit? Wird eine Ausnahme ausgelöst? Vielleicht gibt es nicht die richtigen privs auf diesem Verzeichnis/Datei, um es aus Ihrem Komponententest löschen zu können? –
Das 'os.remove() 'Teil im Code löscht die Datei aus dem temporären Verzeichnis. Um die hochgeladene Datei zu löschen, müsste ich in das Medienverzeichnis schauen und einer komplizierteren Logik folgen, um den genauen Speicherort der Datei zu finden. Ich suche nach einem einfacheren, automatisierten Weg, es zu tun, wenn es überhaupt existiert. – sttwister
D'oh, Entschuldigung! Ich habe deinen Beitrag falsch gelesen. Wie wäre es mit hacking settings.MEDIA_ROOT = '/ pfad/zu/project/statisch/und/dann/alternative/speicher /' und einstellungen.MEDIA_URL = '/ statisch/und/dann/alternative/speicher /' in ihrem setup für ihre tests ? Hacky, aber könnte den Job machen ... –