Я пытаюсь построить тесты для некоторых моделей, у которых есть 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 способ работы с модульными тестами, включающими файлы?
os.remove()
в коде удаляет файл из временного каталога. Чтобы удалить загруженный файл, мне пришлось бы заглянуть в каталог мультимедиа и следовать более сложной логике, чтобы найти точное местоположение файла. Я ищу более простой автоматизированный способ сделать это, если он вообще существует. - person sttwister   schedule 15.02.2010