10

我有一个从单元测试调用的函数。通过设置一些调试跟踪,我知道该函数就像一个魅力一样工作,并且所有值都正确准备好返回。

这就是我的测试代码的样子(看看我的 ipdb.set_trace() 在哪里):

@override_settings(REGISTRATION_OPEN=True)
def test_confirm_account(self):
    """ view that let's a user confirm account creation and username
        when loggin in with social_auth """    
    request = self.factory.get('')
    request.user = AnonymousUser()
    request.session={}
    request.session.update({self.pipename:{'backend':'facebook',
                                           'kwargs':{'username':'Chuck Norris','response':{'id':1}}}})

    # this is the function of which i need the context:
    response = confirm_account(request)
    self.assertEqual(response.context['keytotest'],'valuetotest')

根据我从这部分 Django 文档中了解到的情况,当我使用测试客户端时,我将能够访问 response.context。但是当我尝试像我那样访问 response.context 时,我得到了这个:

AttributeError:“HttpResponse”对象没有属性“上下文”

有没有办法在不使用客户端的情况下获取客户端的特殊 HttpResponse 对象?

4

5 回答 5

11

RequestFactory 不涉及 Django 中间件,因此,您不会生成上下文(即没有 ContextManager 中间件)。

如果要测试上下文,则应使用测试客户端。您仍然可以使用模拟或简单地在测试中提前保存会话来操纵测试客户端中请求的构造,例如:

from django.test import Client
c = Client()
session = c.session
session['backend'] = 'facebook'
session['kwargs'] = {'username':'Chuck Norris','response':{'id':1}}
session.save()

现在,当您使用测试客户端加载视图时,您将使用您设置的会话,当您使用 时response = c.get('/yourURL/'),您可以response.context根据需要引用响应上下文。

于 2012-07-19T02:16:47.463 回答
5

对于新的 django 版本,“response.context”不正确,但您可以使用 response.context_data 来获取传递给 TemplateResponse 的相同上下文。

于 2016-10-24T14:36:06.787 回答
1

虽然这是一篇旧帖子,但我想这个提示可能会有所帮助。您可以研究使用TemplateResponse(or SimpleTemplateResponse) 可以替代renderor render_to_response

Django 文档对此有更多了解

于 2015-11-19T11:23:44.040 回答
0

是的你可以。您必须修补渲染。

我正在使用 pytest-django

class Test:
    def context(self, call_args):
        args, kwargs = call_args
        request_mock, template, context = args
        return context

    @patch('myapplication.views.render')
    def test_(self, mock_render, rf):
        request = rf.get('fake-url')
        view(request)
        context = self.context(mock_render.call_args)

        keytotest = 'crch'
        assert keytotest == context['keytotest']
于 2016-06-07T19:02:57.420 回答
-5

上下文(原文如此!)可以在 Response 类中找到。如您所见,它是您从视图函数返回的HTTP响应。发生这种情况是因为您直接调用了它。通过测试客户端调用这个函数就可以了。

response = client.get('/fobarbaz/')
response.context
于 2012-04-13T22:33:24.667 回答