检测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 )。 我喜欢这个清晰度。