自定义上下文处理器,UnitTests和请求工厂

时间:2013-07-24 22:13:59

标签: django unit-testing requestfactory

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

from settings import localsettings
from settings import testsetttings

localtestsettings.context_processors = testsettings.context_processors

tests(unittest):.....

非常欢迎任何其他建议。

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

答案 1 :(得分: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):
    ...