Sto provando a costruire test per alcuni modelli che hanno un FileField. Il modello si presenta così:Test di Django FileField usando i dispositivi di prova
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
ho incontrato due problemi:
Durante il salvataggio di dati in un apparecchio utilizzando
./manage.py dumpdata
, il contenuto del file non vengono salvate, solo il nome del file viene salvato nella apparecchio. Mentre trovo questo comportamento atteso in quanto i contenuti del file non vengono salvati nel database, mi piacerebbe in qualche modo includere queste informazioni nella fixture per i test.Ho un banco di prova per il caricamento di un file che assomiglia a questo:
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))
Mentre questo test funziona bene, lascia il file caricato nella directory dei media dopo la rifinitura. Naturalmente, la cancellazione potrebbe essere risolta in tearDown()
, ma mi stavo chiedendo se Django avesse un altro modo di affrontare questo.
Una soluzione a cui stavo pensando stava utilizzando una cartella multimediale diversa per i test che devono essere sincronizzati con i dispositivi di prova. Esiste un modo per specificare un'altra directory multimediale in settings.py
quando vengono eseguiti i test? E posso includere una sorta di hook per dumpdata in modo che sincronizzi i file nelle cartelle multimediali?
Quindi, c'è un modo più Pythonico o Django specifico per gestire i test unitari che riguardano i file?
Così os.remove (foo) lavoro does't? Fa un'eccezione? Forse non ci sono i privilegi corretti su quella directory/file per poterlo eliminare dall'interno del test dell'unità? –
Il 'os.remove() 'parte nel codice cancella il file dalla directory temp. Per eliminare il file caricato, dovrei cercare nella directory multimediale e seguire una logica più complicata per trovare la posizione esatta del file. Sto cercando un modo più semplice e automatico per farlo, se esiste anche. – sttwister
D'oh, mi dispiace! Ho letto male il tuo post. Che ne dici delle impostazioni di hacking.MEDIA_ROOT = '/ percorso/a/progetto/statico/e/allora/alternativa/archiviazione /' e impostazioni.MEDIA_URL = '/ statico/e/poi/alternativa/archiviazione /' nel tuo setUp per i tuoi test ? Hacky, ma potrebbe fare il lavoro ... –