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

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

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

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

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

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

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

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


person zmbq    schedule 17.02.2014    source источник


Ответы (1)


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

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

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

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

person Kevin Christopher Henry    schedule 18.02.2014