Я пытаюсь построить тесты для некоторых моделей, имеющих FileField. Модель выглядит следующим образом:Django test 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 (Foo) does't работы? Вызывает ли это исключение? Возможно, в этом каталоге/файле нет правильных привилегий, чтобы иметь возможность удалять их изнутри вашего модульного теста? –
'os.remove() 'в коде удаляет файл из каталога temp. Чтобы удалить загруженный файл, мне придется искать в медиа-каталоге и выполнять более сложную логику, чтобы найти точное местоположение файла. Я ищу более простой, автоматический способ сделать это, если он даже существует. – sttwister
D'oh, извините! Я неправильно прочитал ваш пост. Как насчет хакерских настроек.MEDIA_ROOT = '/ path/to/project/static/и/then/alternative/storage /' и settings.MEDIA_URL = '/ static/and/then/alternative/storage /' в вашем setUp для ваших тестов ? Хакки, но мог бы выполнить эту работу ... –