检测djangotesting模式
我正在编写一个可重用的Django应用程序,我需要确保它的模型只在应用程序处于testing模式时同步。 我试过使用自定义的DjangoTestRunner,但是我没有find如何做的例子(文档只显示了如何定义一个自定义的testing运行器)。
那么,有没有人知道如何去做?
编辑
以下是我如何做到这一点:
#in settings.py import sys TEST = 'test' in sys.argv
希望能帮助到你。
我想在这里提供的答案https://stackoverflow.com/a/7651002/465673是一个更干净的方式做到这一点:;
把它放在你的settings.py中:
import sys TESTING = sys.argv[1:2] == ['test']
选定的答案是一个巨大的黑客攻击。 🙂
一个不太大的破解就是创build你自己的TestSuiteRunner子类,改变一个设置或者为你的应用程序的其余部分做任何其他的事情。 您在您的设置中指定testing运行器:
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)
不太清楚你的用例,但是我看到在testing套件运行时检测的一种方法是检查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
这个归因于由setup_test_environment
的Djangotesting运行器添加,并在teardown_test_environment
删除。 你可以在这里查看源代码: https : //code.djangoproject.com/browser/django/trunk/django/test/utils.py
编辑:如果你想模型定义testing只有那么你应该检查出Django票#7835特别是评论#24其中部分给出如下:
显然你可以直接在你的tests.py中定义模型。 Syncdb永远不会导入tests.py,所以这些模型不会同步到正常的数据库,但是他们会同步到testing数据库,并且可以在testing中使用。
我正在使用settings.py覆盖。 我有一个全局的settings.py,它包含了大部分东西,然后我覆盖它。 每个设置文件开始于:
from myproject.settings import settings
然后继续覆盖一些设置。
- prod_settings.py – 生产设置(例如,覆盖DEBUG = False)
- dev_settings.py – 开发设置(例如更多日志logging)
- test_settings.py
然后,我可以在基本settings.py中定义UNIT_TESTS = False,并在test_settings.py中将其覆盖为UNIT_TESTS = True。
然后,每当我运行一个命令,我需要决定运行哪些设置(例如DJANGO_SETTINGS_MODULE=myproject.test_settings ./manage.py test
)。 我喜欢这个清晰度。