这个问题看起来很简单,但不幸的是谷歌有点困难。
我的问题是:如何在视图中检测到它是否在测试环境中被调用?
#pseudo_code
def my_view(request):
if not request.is_secure() and not TEST_ENVIRONMENT:
return HttpResponseForbidden()
答案 0 :(得分:105)
将它放在settings.py中:
import sys
TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
这将测试第二个命令行参数(./manage.py
之后)是否为test
。然后,您可以从其他模块访问此变量,如下所示:
from django.conf import settings
if settings.TESTING:
...
有充分的理由这样做:假设你正在访问一些后端服务,而不是Django的模型和数据库连接。然后,您可能需要知道何时调用生产服务与测试服务。
答案 1 :(得分:16)
创建自己的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)
答案 2 :(得分:14)
只需查看request.META['SERVER_NAME']
def my_view(request):
if request.META['SERVER_NAME'] == "testserver":
print "This is test environment!"
答案 3 :(得分:6)
我认为最好的方法是使用自己的设置文件(即settings / tests.py)运行测试。该文件可能如下所示(第一行从local.py设置文件导入设置):
from local import *
TEST_MODE = True
然后执行ducktyping以检查您是否处于测试模式。
try:
if settings.TEST_MODE:
print 'foo'
except AttributeError:
pass
答案 4 :(得分:5)
还有一种方法可以暂时覆盖Django中单元测试中的设置。对于某些情况,这可能是一种更简单/更清洁的解决方案。
您可以在测试中执行此操作:
with self.settings(MY_SETTING='my_value'):
# test code
或者将其添加为测试方法的装饰器:
@override_settings(MY_SETTING='my_value')
def test_my_test(self):
# test code
您还可以为整个测试用例类设置装饰器:
@override_settings(MY_SETTING='my_value')
class MyTestCase(TestCase):
# test methods
有关详细信息,请查看Django文档:https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.override_settings
答案 5 :(得分:1)
回顾@ Tobia的回答,我认为最好在settings.py中实现,如下所示:
import sys
try:
TESTING = 'test' == sys.argv[1]
except IndexError:
TESTING = False
这可以防止它捕获./manage.py loaddata test.json
或./manage.py i_am_not_running_a_test
答案 6 :(得分:0)
虽然没有正式的方法可以查看我们是否处于测试环境中,但Django实际上为我们留下了一些线索。 默认情况下,Django的测试运行器automatically redirects all Django-sent email to a dummy outbox。这可以通过在名为EMAIL_BACKEND的函数中替换setup_test_environment来实现,该函数依次由DiscoverRunner的method调用。因此,我们可以检查settings.EMAIL_BACKEND是否设置为'django.core.mail.backends.locmem.EmailBackend'。这意味着我们正在测试环境中。
一种不太hacky的解决方案是通过继承DisoverRunner的子类,然后覆盖setup_test_environment方法来添加我们自己的设置,以遵循开发人员的指导。
答案 7 :(得分:0)
如果您是针对不同环境的多个设置文件,那么您要做的就是创建一个用于测试的设置文件。
例如,您的设置文件是:
your_project/
|_ settings/
|_ __init__.py
|_ base.py <-- your original settings
|_ testing.py <-- for testing only
在您的testing.py中,添加一个TESTING
标志:
from .base import *
TESTING = True
在您的应用程序中,您可以访问settings.TESTING
来检查您是否在测试环境中。
要运行测试,请使用:
python manage.py test --settings your_project.settings.testing