【发布时间】:2013-08-04 05:23:00
【问题描述】:
如何仅在测试期间禁用特定中间件(我编写的自定义中间件)?
【问题讨论】:
标签: django django-testing django-middleware
如何仅在测试期间禁用特定中间件(我编写的自定义中间件)?
【问题讨论】:
标签: django django-testing django-middleware
也相关(因为此页面在相关查询的搜索引擎中排名很高):
如果您只想为单个案例禁用中间件,也可以使用@modify_settings:
@modify_settings(MIDDLEWARE={
'remove': 'django.middleware.cache.FetchFromCacheMiddleware',
})
def test_my_function(self):
pass
【讨论】:
modify_settings(以及更普遍的设置修改)不是线程安全的,因此您应该不在生产中使用它。如果您想在视图中禁用中间件,您可能试图以错误的方式解决问题(例如,中间件可以检查请求/视图以确定它应该何时运行吗?)
https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.override_settings
from django.test import TestCase, override_settings
from django.conf import settings
class MyTestCase(TestCase):
@override_settings(
MIDDLEWARE_CLASSES=[mc for mc in settings.MIDDLEWARE_CLASSES
if mc != 'myapp.middleware.MyMiddleware']
)
def test_my_function(self):
pass
【讨论】:
有几种选择:
为测试创建一个单独的test_settings 设置文件,然后通过以下方式运行测试:
python manage.py test --settings=test_settings
如果test 在sys.argv 中,则即时修改您的settings.py
if 'test' in sys.argv:
# modify MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES = list(MIDDLEWARE_CLASSES)
MIDDLEWARE_CLASSES.remove(<middleware_to_disable>)
希望对您有所帮助。
【讨论】:
通过单点修改来处理这个问题的一个好方法是在 Django 项目的根目录下创建一个conftest.py 文件,并将以下内容放入其中:
from django.conf import settings
def pytest_configure():
"""Globally remove the your_middleware_to_remove for all tests"""
settings.MIDDLEWARE.remove(
'your_middleware_to_remove')
【讨论】: