【问题标题】:Disable a specific Django middleware during tests在测试期间禁用特定的 Django 中间件
【发布时间】:2013-08-04 05:23:00
【问题描述】:

如何仅在测试期间禁用特定中间件(我编写的自定义中间件)?

【问题讨论】:

    标签: django django-testing django-middleware


    【解决方案1】:

    也相关(因为此页面在相关查询的搜索引擎中排名很高):

    如果您只想为单个案例禁用中间件,也可以使用@modify_settings

    @modify_settings(MIDDLEWARE={
        'remove': 'django.middleware.cache.FetchFromCacheMiddleware',
    })
    def test_my_function(self):
        pass
    

    【讨论】:

    • 这也可以用于视图和特定请求,还是仅用于测试用例?
    • modify_settings(以及更普遍的设置修改)不是线程安全的,因此您应该在生产中使用它。如果您想在视图中禁用中间件,您可能试图以错误的方式解决问题(例如,中间件可以检查请求/视图以确定它应该何时运行吗?)
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      有几种选择:

      • 为测试创建一个单独的test_settings 设置文件,然后通过以下方式运行测试:

        python manage.py test --settings=test_settings 
        
      • 如果testsys.argv 中,则即时修改您的settings.py

        if 'test' in sys.argv:
             # modify MIDDLEWARE_CLASSES
              MIDDLEWARE_CLASSES = list(MIDDLEWARE_CLASSES)
              MIDDLEWARE_CLASSES.remove(<middleware_to_disable>)
        

      希望对您有所帮助。

      【讨论】:

      • 是的!!!我即时修改了配置,因为我想避免指定一个新的设置文件!非常感谢;)
      • @daveoncode 您究竟是如何即时修改 settings.py 文件的?
      【解决方案4】:

      通过单点修改来处理这个问题的一个好方法是在 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')
      
      

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 1970-01-01
        • 2016-09-01
        • 2012-10-25
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 2011-03-03
        相关资源
        最近更新 更多