Я пытаюсь создать тесты для некоторых моделей, которые имеют 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-specific way контакта с модульными тестами, включающими файлы?
Раньше я писал модульные тесты для всего приложения галереи, и у меня хорошо сработало использование модулей python tempfile и shutil для создания копий проверьте файлы во временных каталогах, а затем удалите их все.
Следующий пример не работает / не завершен, но должен указать вам правильный путь:
import os, shutil, tempfile
PATH_TEMP = tempfile.mkdtemp(dir=os.path.join(MY_PATH, 'temp'))
def make_objects():
filenames = os.listdir(TEST_FILES_DIR)
if not os.access(PATH_TEMP, os.F_OK):
os.makedirs(PATH_TEMP)
for filename in filenames:
name, extension = os.path.splitext(filename)
new = os.path.join(PATH_TEMP, filename)
shutil.copyfile(os.path.join(TEST_FILES_DIR, filename), new)
#Do something with the files/FileField here
def remove_objects():
shutil.rmtree(PATH_TEMP)
Я запускаю эти методы в методах setUp () и tearDown () моих модульных тестов, и он отлично работает! У вас есть чистая копия ваших файлов, чтобы протестировать ваше файловое поле, которое можно использовать многократно и предсказуемо.