【问题标题】:Custom Context Processors, UnitTests, and Request Factory自定义上下文处理器、单元测试和请求工厂
【发布时间】:2013-07-24 14:52:55
【问题描述】:

我已经开始使用自定义上下文处理器将对象传递给每个响应。唯一的问题是我的测试现在失败了,因为他们在数据库中找不到这个对象。我尝试使用请求工厂创建测试,因为我的理解是这将测试与 Django 膨胀(如中间件等)隔离开来。我猜上下文处理器仍在运行。有没有办法克服这个问题?我是否必须将这个对象传递给每个测试?如果有任何方法可以避免它,我宁愿这样做。

【问题讨论】:

    标签: django unit-testing requestfactory


    【解决方案1】:

    在tests.py上使用这个对我来说效果很好

    from django.test import TestCase, Client, override_settings
    
    @override_settings (
      TEMPLATES = [
      {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
      },
      ]
    )
    
    class HomeViewTestCase(TestCase):
        ...
    

    【讨论】:

      【解决方案2】:

      经过进一步调查,我认为最好的解决方案是在每次测试期间覆盖 context_processors 元组。从 1.4 开始,这已经成为可能。这似乎比向每个测试发送所需的对象要好。我想调查一下我是否可以为它编写一个自定义装饰器,但对它们还不够了解。参考:https://docs.djangoproject.com/en/dev/topics/testing/overview/#overriding-settings

      编辑:此处概述的此解决方案的另一个实现:How to Unit test with different settings in Django? 可能更好,因为它可以用于整个测试。py

      edit2:发现装饰器实际上是 python 构造(假设它们是自定义 django 功能!顺便说一下,python 的大量新手。在我学习任何 python 之前学习了 django),我认为自定义装饰器是我的方式和这个一起去吧。

      edit3:我认为实际上更简单的解决方案是在我的设置模块中有一个 test.py 文件,并用测试中的测试设置覆盖我的基本设置 context_processor 模块。例如:

      from settings import localsettings
      from settings import testsetttings
      
      localtestsettings.context_processors = testsettings.context_processors
      
      tests(unittest):.....
      

      欢迎提出任何其他建议。

      edit4:好的。我现在觉得很傻。显然,我最终使用的解决方案是创建一个测试设置文件,并将其传递给测试命令。

      【讨论】:

        猜你喜欢
        • 2020-04-13
        • 2017-07-06
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        相关资源
        最近更新 更多