Каков чистый способ unittest FileField в django?

У меня есть модель с FileField. Я хочу unittest это. Django test framework имеет отличные способы управления базой данных и электронной почтой. Есть ли что-то подобное для FileFields?

Как я могу убедиться, что unittests не собираются загрязнять реальное приложение?

спасибо заранее

PS: мой вопрос почти дубликат Django test FileField с использованием тестовых приспособлений но у него нет принятого ответа. Просто хочу еще раз спросить, что-то новое на эту тему.

4 ответов


есть несколько способов решить эту проблему, но все они уродливы, так как модульные тесты должны быть изолированы, но файлы все о прочных изменениях.

мои модульные тесты не работают в системе с производственными данными, поэтому было легко просто сбросить каталог загрузки после каждого запуска с чем-то вроде git reset --hard. Этот подход в некотором смысле является лучшим просто потому, что он не предполагает изменений кода и гарантированно работает до тех пор, пока вы начинаете с хороших тестовых данных.

Если вам на самом деле не нужно ничего делать с этим файлом после тестирования метода сохранения вашей модели, я бы рекомендовал использовать отличныймакет библиотека полностью фейк File экземпляр (т. е. что-то вроде mock_file = Mock(spec=django.core.files.File); mock_file.read.return_value = "fake file contents") таким образом, вы можете полностью избежать изменений в логике обработки файлов. В библиотеке Mock есть несколько способов патч Джанго файл класс в рамках метода тестирования, который примерно так же легко, как это получить.

Если вам нужен реальный файл (т. е. для работы в качестве части теста, обработки с помощью внешнего скрипта и т. д.) вы можете использовать что-то похожее на пример Мирко и создать убедившись, что он будет храниться где - то в соответствующем месте-вот три способа сделать это:

  • ваш тест settings.MEDIA_ROOT укажите на временный каталог (см. Python tempfile модуль

Django предоставляет отличный способ сделать это-использовать SimpleUploadedFile.

from django.core.files.uploadedfile import SimpleUploadedFile

my_model.file_field = SimpleUploadedFile('best_file_eva.txt', 'these are the file contents!')

Это одна из магических функций django-которая-не-появляется-в-документах :). Однако это относится к здесь.


Я обычно тест filefields в моделях с использованием doctest

>>> from django.core.files import File
>>> s = SimpleModel()
>>> s.audio_file = File(open("media/testfiles/testaudio.wav"))
>>> s.save()
>>> ...
>>> s.delete()

Если мне нужно, я также тестирую загрузку файлов с тестовыми клиентами.

что касается светильников, я просто копирую файлы, которые мне нужны, в тестовую папку после изменения путей в светильнике.

например

в приспособлении, содержащем модели с filefiels, указывающими на каталог с именем "audio", вы заменяете" audio": "audio/audio.wav " с "audio": "аудио/тест/аудио.в формате WAV" .
Теперь все у вас для этого скопируйте тестовую папку с необходимыми файлами в" audio " в тестовой установке, а затем удалите ее в tearDown.

Не так чисто, как я думаю, но это то, что я делаю.


Если вы просто хотите создать объект для этого требуется FileField и не хочу использовать это поле тогда вы можете просто пройти любой (существующий или нет) относительный путь, как это:

self.example_object = models.ExampleModel({'file': "foo.bar"})
self.example_object.save()

затем он готов к использованию.