Каков чистый способ 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()
затем он готов к использованию.