我有一个我从单元测试中调用的函数。通过设置一些调试跟踪,我知道该功能就像魅力一样,并且具有为返回而准备好的所有值。
这就是我的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对象?
答案 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
)来代替render
或render_to_response
。
答案 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