Инициализация MEDIA_ROOT перед каждым тестом Django

Я хочу, чтобы мои тесты Django создавали и модифицировали медиа-файлы. Итак, так же, как тесты Django с базами данных, я хочу создать пустую папку MEDIA_ROOT перед каждым тестом.

Я решил создать временную папку и указать на нее MEDIA_ROOT. Тем не менее, я не могу понять, где разместить код, который делает это. В этом примере особый Runner создано. Бегун устанавливает корень носителя и разрушает его.

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

Я пытался создать FileSystemTestCase класс, который устанавливает файловую систему в своем setUp функция, и все мои тестовые случаи вытекают из него. Хотя это работает, требуется, чтобы каждый, кто пишет тестовый сценарий, не забывал звонить setUp метод, так как он не вызывается автоматически.

Обычно я не стал бы беспокоиться об этом, но цена забывания вызова родительского метода setUp может быть очень высокой - если кто-то забудет о вызове, и тесты будут случайно запущены в работающей системе, произойдут плохие вещи.

РЕДАКТИРОВАТЬ: Временное решение, которое я нашел, состояло в том, чтобы реализовать и моего собственного бегуна и базу TestCase, Оба настроили временный MEDIA_ROOT, так что если кто-то забудет позвонить моему setUp В этом случае тест будет выполняться во временной папке предыдущего теста или в папке, установленной бегуном. Это может привести к сбою тестов, но не приведет к повреждению текущих данных.

Я надеюсь на более элегантное решение.

1 ответ

Решение

Мне кажется, что вы пытаетесь решить две отдельные проблемы:

  1. Разрешить выполнение тестов самостоятельно (с учетом MEDIA_ROOT) когда тестировщики делают правильные вещи (т.е. наследуют от вашего тестового класса и называют ваш setUp()).
  2. Не позволяйте тестировщикам испортить реальные данные, когда они случайно поступают неправильно.

Учитывая это, я думаю, что двусторонний подход имеет смысл. Ваш setUp() решает проблему 1. Настройка MEDIA_ROOT Однако в тестовой программе скрывается тот факт, что ваши тестеры сделали не то, что нужно. Вместо этого я бы просто сосредоточился на защите данных: например, вы могли бы установить MEDIA_ROOT в None, Это защитит реальные данные в MEDIA_ROOT; сделать более вероятным, что тестер увидит ошибку, если они не используют ваш setUp(); и уменьшить дублирование кода.

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

Другие вопросы по тегам