2012-04-13 9 views
7

Mam funkcję, którą wywołuję z unittest. Od ustawienia niektórych ścieżek debugowania wiem, że funkcja działała jak czar i ma wszystkie wartości poprawnie przygotowane do powrotu.Czy mogę uzyskać dostęp do kontekstu odpowiedzi w widoku testowanym bez klienta testowego?

To właśnie moja testcode wygląda (patrz gdzie mój ipdb.set_trace() jest):

@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') 

z tego co wiem od this part of the Django docs, chciałbym być w stanie uzyskać dostęp response.context gdy użyłem klient testujący. Ale gdy próbuję dostęp response.context jak zrobiłem to, ja się tak:

AttributeError: 'HttpResponse' object has no attribute 'context'

Czy istnieje sposób, aby uzyskać specjalny obiekt HttpResponse klienta, bez użycia klienta?

Odpowiedz

-3

Kontekst (sic!) Można znaleźć w klasie Response. Jak widać, jest to odpowiedź, którą otrzymujesz z funkcji widoku. Stało się tak, ponieważ nazwałaś to bezpośrednio. Wywołaj tę funkcję za pomocą klienta testowego i wszystko będzie w porządku.

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

Wywołanie go za pośrednictwem klienta testowego nie daje mi pełnej kontroli nad procesem tworzenia żądania. Zdecydowanie zapytałem, czy jest to możliwe bez klienta. – marue

+0

W moich testach manipuluję sesją za pomocą wbudowanego klienta (patrz client.session). Czy to właśnie nazywacie kontrolowaniem konturu? Jeśli tak, rozważ ponownie swoje zdanie. – starenka

+2

Nie, nie jest. Sesja to informacja o pewnym użytkowniku przechowywanym na serwerze, żądanie jest tym, co klient wysyła do serwera w celu zażądania odpowiedzi serwera. Kontekst odpowiedzi (o który pytałem) jest używany tylko do testowania i zawiera informacje o tym, w jaki sposób serwer utworzył odpowiedź (tj. Które szablony zostały użyte). To nie jest to samo, co kontekst żądania, a nie to samo, co sesja. – marue

8

RequestFactory nie dotyka middleware Django, i jako takie, nie będzie generować kontekst (czyli nie middleware ContextManager).

Aby przetestować kontekst, należy użyć klienta testowego. Nadal można manipulować budowę wniosku w kliencie testowym albo za pomocą mock lub po prostu zapisywania sesji z wyprzedzeniem w badaniu, takie jak:

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

Teraz, kiedy załadować widok z klientem testowym , będziesz używał sesji podczas jej ustawiania, a kiedy użyjesz response = c.get('/yourURL/'), możesz odwołać się do kontekstu odpowiedzi, używając do tego żądanego response.context.

1

Chociaż jest to stary post, przypuszczam, że ta wskazówka może być pomocna. Możesz przyjrzeć się używaniu TemplateResponse (lub SimpleTemplateResponse), które można zastąpić render lub render_to_response.

Django docs ma więcej na ten

0

Tak, można. Musisz załatać render.

Używam 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'] 
0

W „response.context” jest błędna, ale można użyć response.context_data aby uzyskać ten sam kontekst, który przeszedł do TemplateResponse.

+0

Cierpisz, ale to prawda.'response.context' to obiekt' ContextList', natomiast 'response.context_data' to słownik o strukturze podobnej do instancji' Context' przekazywanej do szablonu. –

Powiązane problemy