Django 单元测试响应上下文为 None

问题描述 投票:0回答:4

为什么下面的测试中response.context None ?我检查了response.content,它是“”。如果我删除 assertIsNotNone 行,我会收到 TypeError: 'NoneType' object is not subscribable

def test_log_view_with_no_entries(self):
    """
    If no logs are available, an appropriate message should be displayed.
    """
    response = self.client.get(reverse('swpgr:logs'))
    self.assertIsNotNone(response.context)
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "No logs are available.")
    self.assertQuerysetEqual(response.context['log_list'], [])

def test_log_view_with_one_entry(self):
    """
    Logs should be displayed it table.
    """
    time = timezone.now()
    t = LogEntry.objects.create(event_date=time, command_type="Test", command_source="Test Case",
        username="user")
    response = self.client.get(reverse('swpgr:logs'))
    self.assertIsNotNone(response.context)
    self.assertQuerysetEqual(
        response.context['log_list'],
        ['<LogEntry: 1 Test user: user>']
    )`
python django unit-testing
4个回答
6
投票

快速解决方法

Context 类(派生自 SimpleTemplateResponse)还有另一个成员字典,称为 context_data。使用它而不是仅仅使用 context 将给出预期的上下文字典(django 1.9)。 但请注意,自 django 1.8 起它被定义为已弃用。因此,使用它需要您自担风险。不幸的是,直到现在我还没有研究出合适的替代方案。

背景

响应的 context 属性的存在似乎取决于您正在使用的模板引擎(模板)的类型。 如果您选择除 django 附带的引擎(默认)之外的其他引擎,您可能会在 context_data 属性

找到该字典

参考文献


4
投票

我遇到了这个问题,为了修复它,在设置函数中执行了以下操作:

from django.test.utils import setup_test_environment
setup_test_environment()

1
投票

在我们的例子中,问题不在

setup_test_environment()
(因为
pytest-django
确实会自动为我们调用),但是,正如@tobltobs在他/她的评论中提到的,它是缓存。

交换

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'test-cache',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

为我们解决了所有问题。


0
投票

setup_test_environment() 安装一个模板渲染器,它允许我们检查响应上的一些附加属性,例如 response.context,否则这些属性将不可用。请注意,此方法不会设置测试数据库,因此以下内容将针对现有数据库运行,并且输出可能会略有不同,具体取决于您已创建的问题。如果 settings.py 中的 TIME_ZONE 不正确,您可能会得到意外的结果。如果您不记得之前设置过,请在继续之前检查一下。

参考:https://docs.djangoproject.com/en/5.0/intro/tutorial05/#the-django-test-client

© www.soinside.com 2019 - 2024. All rights reserved.