Я пытаюсь построить тесты для некоторых моделей, имеющих FileField. Модель выглядит так:
class SolutionFile(models.Model):
'''
A file from a solution.
'''
solution = models.ForeignKey(Solution)
file = models.FileField(upload_to=make_solution_file_path)
Я столкнулся с двумя проблемами:
При сохранении данных в прибор с помощью ./manage.py dumpdata
содержимое файла не сохраняется, в него сохраняется только имя файла. Хотя я считаю, что это ожидаемое поведение, поскольку содержимое файла не сохраняется в базе данных, я хотел бы каким-то образом включить эту информацию в тестовое устройство для тестов.
У меня есть тестовый пример для загрузки файла, который выглядит следующим образом:
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))
Хотя этот тест работает просто отлично, после завершения он оставляет загруженный файл в каталоге мультимедиа. Конечно, об удалении можно было бы позаботиться в tearDown()
, но мне было интересно, есть ли у Django другой способ справиться с этим.
Одним из решений, о котором я думал, было использование другой папки мультимедиа для тестов, которые должны синхронизироваться с тестовыми приборами. Есть ли способ указать другой каталог мультимедиа в settings.py
во время выполнения тестов? И могу ли я добавить какой-нибудь хук к dumpdata, чтобы он синхронизировал файлы в медиа-папках?
Итак, есть ли более специфичный для Pythonic или Django способ работы с модульными тестами, включающими файлы?