Могу ли я получить доступ к контексту ответа протестированного представления без тестового клиента?
У меня есть функция, которую я вызываю из unittest. Из установки некоторых трасс отладки я знаю, что функция работала как шарм и правильно подготовила все значения для возврата.
Вот как выглядит мой тестовый код (посмотрите, где находится мой 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' нет атрибута 'context'
Есть ли способ получить специальный объект HttpResponse клиента, без использования клиента?
5 ответов
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
по желанию.
"Response.context" неверен, но вы можете использовать response.context_data, чтобы получить тот же контекст, который был передан в TemplateResponse.
Да, ты можешь. Вы должны исправить патч.
Я использую 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']
Хотя это старый пост, я полагаю, этот совет может помочь. Вы можете посмотреть на использование TemplateResponse
(или же SimpleTemplateResponse
) который может быть заменен render
или же render_to_response
,
Django Docs имеет больше об этом
Контекст (sic!) можно найти в классе Response. Как вы видите, он говорит, что это HTTP Response, вы возвращаетесь из функции просмотра. Это произошло потому, что вы позвонили напрямую. Вызовите эту функцию через тестовый клиент, и все будет в порядке.
response = client.get('/fobarbaz/')
response.context