Тест Django FileField с помощью тестовых приспособлений

Я пытаюсь создать тесты для некоторых моделей, которые имеют FileField. Модель похожа на это:

class SolutionFile(models.Model):
    '''
    A file from a solution.
    '''
    solution = models.ForeignKey(Solution)
    file = models.FileField(upload_to=make_solution_file_path)

Я встретился с двумя проблемами:

  1. При сохранении данных к использованию приспособления ./manage.py dumpdata, содержание файла не сохраняется, только имя файла сохраняется в приспособление. В то время как я нахожу, что это ожидаемое поведение, поскольку содержание файла не сохраняется в базу данных, я хотел бы так или иначе включать эту информацию в приспособление для тестов.

  2. У меня есть тестовый сценарий для загрузки файла, который похож на это:

    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 контакта с модульными тестами, включающими файлы?

24
задан Gabriel Hurley 15 February 2010 в 22:15
поделиться

1 ответ

Раньше я писал модульные тесты для всего приложения галереи, и у меня хорошо сработало использование модулей 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 () моих модульных тестов, и он отлично работает! У вас есть чистая копия ваших файлов, чтобы протестировать ваше файловое поле, которое можно использовать многократно и предсказуемо.

3
ответ дан 29 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: