5

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

4

2 回答 2

2

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

编辑:此处概述的此解决方案的另一个实现:如何在 Django 中使用不同的设置进行单元测试?可能会更好,因为它可以用于整个 tests.py

编辑2:发现装饰器实际上是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):.....

任何其他建议都非常受欢迎。

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

于 2013-07-25T01:04:25.533 回答
2

在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):
    ...
于 2017-02-15T02:30:54.230 回答