Я пытаюсь построить тесты для некоторых моделей, имеющих 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, чтобы она синхронизировала файлы в папках с носителями?
Итак, существует ли более питоновский или Django-специфический способ решения модульных тестов с участием файлов?