Ответ 1
Я думаю, что приведенный здесь ответ fooobar.com/questions/51214/... - это гораздо более чистый способ сделать это:
Поместите это в свои settings.py:
import sys
TESTING = sys.argv[1:2] == ['test']
Я пишу многоразовое приложение django, и мне нужно убедиться, что его модели только синхронизируются, когда приложение находится в тестовом режиме. Я попытался использовать пользовательский DjangoTestRunner, но я не нашел примеров того, как это сделать (документация показывает только, как определить пользовательский тестовый бегун).
Итак, кто-нибудь знает, как это сделать?
ИЗМЕНИТЬ
Вот как я это делаю:
#in settings.py
import sys
TEST = 'test' in sys.argv
Надеюсь, что это поможет.
Я думаю, что приведенный здесь ответ fooobar.com/questions/51214/... - это гораздо более чистый способ сделать это:
Поместите это в свои settings.py:
import sys
TESTING = sys.argv[1:2] == ['test']
Выбранный ответ - массивный взлом.:)
Менее массивным взломом будет создание собственного подкласса TestSuiteRunner и изменение настройки или все, что вам нужно для остальной части вашего приложения. Вы указываете тестовый бегун в своих настройках:
TEST_RUNNER = 'your.project.MyTestSuiteRunner'
В общем, вы не хотите этого делать, но он работает, если вам это абсолютно необходимо.
from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner
class MyTestSuiteRunner(DjangoTestSuiteRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
ПРИМЕЧАНИЕ. Начиная с Django 1.8, DjangoTestSuiteRunner
устарел.
Вместо этого следует использовать DiscoverRunner
:
from django.conf import settings
from django.test.runner import DiscoverRunner
class MyTestSuiteRunner(DiscoverRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
Не совсем уверен в вашем случае использования, но один из способов, который я видел для обнаружения, когда работает тестовый пакет, - проверить, есть ли django.core.mail
атрибут outbox
, например:
from django.core import mail
if hasattr(mail, 'outbox'):
# We are in test mode!
pass
else:
# Not in test mode...
pass
Этот атрибут добавляется тестовым бегуном Django в setup_test_environment
и удаляется в teardown_test_environment
. Вы можете проверить источник здесь: https://code.djangoproject.com/browser/django/trunk/django/test/utils.py
Изменить: если вам нужны модели, определенные для тестирования, то вы должны проверить билет Django # 7835, в частности комментарий # 24, часть из которых приводится ниже:
По-видимому, вы можете просто определить модели непосредственно в test.py. Syncdb никогда не импортирует tests.py, поэтому эти модели не будут синхронизироваться с normal db, но они будут синхронизированы с тестовой базой данных и могут быть используемых в тестах.
Я использую переопределения settings.py. У меня есть global settings.py, который содержит большинство вещей, а затем у меня есть переопределения. Каждый файл настроек начинается с:
from myproject.settings import settings
а затем переопределите некоторые параметры.
И затем я могу определить UNIT_TESTS = False в базовых settings.py и переопределить его в UNIT_TESTS = True в test_settings.py.
Затем всякий раз, когда я запускаю команду, мне нужно решить, какие параметры нужно выполнить (например, DJANGO_SETTINGS_MODULE=myproject.test_settings ./manage.py test
). Мне нравится эта ясность.