我可以在没有测试客户端的情况下访问测试视图的响应上下文吗?

时间:2012-04-13 20:44:50

标签: django django-views django-testing

我有一个我从单元测试中调用的函数。通过设置一些调试跟踪,我知道该功能就像魅力一样,并且具有为返回而准备好的所有值。

这就是我的testcode的样子(请参阅我的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')

据我所知this part of the Django docs,我可以在使用测试客户端时访问response.context。但是,当我尝试访问response.context时,就像我做的那样,我得到了这个:

  

AttributeError:'HttpResponse'对象没有属性'context'

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

5 个答案:

答案 0 :(得分:10)

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

如果要测试上下文,则应使用测试客户端。您仍然可以使用 mock 在测试客户端中操作请求的构造,或者只是在测试中提前保存会话,例如:

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作为响应上下文期望的。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

虽然这是一篇很老的帖子,但我认为这个提示可以提供帮助。您可以使用TemplateResponse(或SimpleTemplateResponse)来代替renderrender_to_response

Django docs在此

上有更多内容

答案 3 :(得分: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']

答案 4 :(得分:-5)

context(sic!)可以在Response类中找到。正如您所看到的那样,它是 HTTP 响应您从视图功能返回。发生这种情况是因为您直接调用了它。通过测试客户端调用此函数,它会没问题。

response = client.get('/fobarbaz/')
response.context