Django:测试客户端的上下文是空的

Mer*_*glu 7 testing django unit-testing

我无法从ipython 访问对象的context属性HttpResponse.但单元测试访问context.

这是单元测试.测试运行正常:

from django.test import Client, TestCase
from django.core import mail

class ClientTest(TestCase):
    def test_get_view(self):
        data = {'var': u'\xf2'}
        response = self.client.get('/test04/', data)

        # Check some response details
        self.assertContains(response, 'This is a test')
        self.assertEqual(response.context['var'], u'\xf2')
Run Code Online (Sandbox Code Playgroud)

这是我在shell中使用的代码:

In [10]: from django.test import Client

In [11]: c = Client()

In [12]: r = c.get('/test04/', data)

In [13]: r.context

In [14]: type(r.context)
Out[14]: <type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)

response.context在shell中没有,而response.context在单元测试中存在.

为什么HttpResponseshell和单元测试之间的行为不一致?

Car*_*yer 8

您可以在Django测试代码中看到它在特殊工具中进行 monkeypatches以使模板呈现发送信号,测试客户端监听该信号,以便它可以使用呈现的模板及其上下文注释响应对象.

要附加此信号,您​​必须在shell会话中调用django.test.utils.setup_test_environment()函数(具有其他副作用),或者只复制monkeypatch模板渲染的行.不是太难,但我同意如果可以重构这个特定的调试方面以使其更容易在测试之外使用,那将是很好的.就个人而言,我不介意在DEBUG为True时是否总是收集此信息,而不仅仅是在测试中.