Могу ли я получить доступ к контексту ответа протестированного представления без тестового клиента?

У меня есть функция, которую я вызываю из 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
Другие вопросы по тегам