Инициализация MEDIA_ROOT перед каждым тестом Django
Я хочу, чтобы мои тесты Django создавали и модифицировали медиа-файлы. Итак, так же, как тесты Django с базами данных, я хочу создать пустую папку MEDIA_ROOT перед каждым тестом.
Я решил создать временную папку и указать на нее MEDIA_ROOT. Тем не менее, я не могу понять, где разместить код, который делает это. В этом примере особый Runner
создано. Бегун устанавливает корень носителя и разрушает его.
К несчастью, setup_test_environment
вызывается один раз перед запуском первой тестовой функции, а не каждый раз при запуске теста.
Я пытался создать FileSystemTestCase
класс, который устанавливает файловую систему в своем setUp
функция, и все мои тестовые случаи вытекают из него. Хотя это работает, требуется, чтобы каждый, кто пишет тестовый сценарий, не забывал звонить setUp
метод, так как он не вызывается автоматически.
Обычно я не стал бы беспокоиться об этом, но цена забывания вызова родительского метода setUp может быть очень высокой - если кто-то забудет о вызове, и тесты будут случайно запущены в работающей системе, произойдут плохие вещи.
РЕДАКТИРОВАТЬ: Временное решение, которое я нашел, состояло в том, чтобы реализовать и моего собственного бегуна и базу TestCase
, Оба настроили временный MEDIA_ROOT, так что если кто-то забудет позвонить моему setUp
В этом случае тест будет выполняться во временной папке предыдущего теста или в папке, установленной бегуном. Это может привести к сбою тестов, но не приведет к повреждению текущих данных.
Я надеюсь на более элегантное решение.
1 ответ
Мне кажется, что вы пытаетесь решить две отдельные проблемы:
- Разрешить выполнение тестов самостоятельно (с учетом
MEDIA_ROOT
) когда тестировщики делают правильные вещи (т.е. наследуют от вашего тестового класса и называют вашsetUp()
). - Не позволяйте тестировщикам испортить реальные данные, когда они случайно поступают неправильно.
Учитывая это, я думаю, что двусторонний подход имеет смысл. Ваш setUp()
решает проблему 1. Настройка MEDIA_ROOT
Однако в тестовой программе скрывается тот факт, что ваши тестеры сделали не то, что нужно. Вместо этого я бы просто сосредоточился на защите данных: например, вы могли бы установить MEDIA_ROOT
в None
, Это защитит реальные данные в MEDIA_ROOT
; сделать более вероятным, что тестер увидит ошибку, если они не используют ваш setUp()
; и уменьшить дублирование кода.
Более надежный подход заключается в написании собственного тестового прогона, который выполняет настройку перед каждым тестом (смоделированный по способу, которым Django обрабатывает базу данных), но это может быть излишним для ваших нужд.