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

mim*_*imc 1 python django unit-testing

为什么在以下测试中 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>']
    )`
Run Code Online (Sandbox Code Playgroud)

woo*_*odz 5

快速解决方法

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

背景

响应的上下文属性的存在似乎取决于您使用的模板引擎(模板)的类型。如果您使用的引擎不是 django(默认)附带的引擎,您可能会在context_data属性中找到字典

参考

  • 事实上,[Django 文档本身推荐](https://docs.djangoproject.com/en/2.1/ref/template-response/#django.template.response.SimpleTemplateResponse.context_data) 将 context_data 用于其他模板引擎 (2认同)

djb*_*jbp 4

我遇到了这个问题,为了解决这个问题,我在 setup 函数中执行了以下操作:

from django.test.utils import setup_test_environment
setup_test_environment()
Run Code Online (Sandbox Code Playgroud)