Estoy intentando crear pruebas para algunos modelos que tienen un FileField. El modelo es el siguiente:Prueba de Django FileField usando dispositivos de prueba
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
me he encontrado con dos problemas:
Al guardar datos a un dispositivo usando
./manage.py dumpdata
, el contenido del archivo no se guardan, sólo el nombre de archivo se guarda en el accesorio. Aunque considero que este es el comportamiento esperado, ya que los contenidos del archivo no se guardan en la base de datos, me gustaría incluir esta información de alguna manera en el dispositivo para realizar pruebas.Tengo un caso de prueba para subir un archivo que tiene el siguiente aspecto:
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))
Si bien esta prueba funciona bien, deja el archivo cargado en el directorio de los medios de comunicación después de terminar. Por supuesto, la eliminación podría resolverse en tearDown()
, pero me preguntaba si Django tenía otra forma de lidiar con esto.
Una solución en la que estaba pensando era utilizar una carpeta de medios diferente para las pruebas que deben mantenerse sincronizadas con los dispositivos de prueba. ¿Hay alguna manera de especificar otro directorio de medios en settings.py
cuando se están ejecutando las pruebas? ¿Y puedo incluir algún tipo de hook a dumpdata para que sincronice los archivos en las carpetas multimedia?
Entonces, ¿hay alguna forma más Pythonic o específica de Django para manejar las pruebas unitarias que involucran archivos?
Así os.remove (foo) does't de trabajo? ¿Lanza una excepción? Tal vez no haya los privilegios correctos en ese directorio/archivo para poder eliminarlo desde dentro de su unidad de prueba? –
El 'os.remove() 'parte en el código elimina el archivo del directorio temporal. Para eliminar el archivo cargado, tendría que buscar en el directorio de medios y seguir una lógica más complicada para encontrar la ubicación exacta del archivo. Estoy buscando una forma más fácil y automatizada para hacerlo, si es que existe. – sttwister
D'oh, lo siento! Leí mal tu publicación. ¿Qué hay de la configuración de hackeo.MEDIA_ROOT = '/ path/to/project/static/y/then/alternative/storage /' y settings.MEDIA_URL = '/ static/y/then/alternative/storage /' en su setUp para sus pruebas ? Hacky, pero podría hacer el trabajo ... –