2012-07-27 10 views

Odpowiedz

14
from django.http import HttpResponsePermanentRedirect 
from django.test.client import Client 

class MyTestClass(unittest.TestCase): 

    def test_my_method(self): 

     client = Client() 
     response = client.post('/some_url/') 

     self.assertEqual(response.status_code, 301) 
     self.assertTrue(isinstance(response, HttpResponsePermanentRedirect)) 
     self.assertEqual(response.META['HTTP_LOCATION'], '/url_we_expect_to_be_redirected_to/') 

Istnieją inne atrybuty odpowiedzi, które mogą być interesujące do przetestowania. Jeśli nie masz pewności, co jest na obiekcie to zawsze można zrobić

print dir(response) 

EDIT dla aktualnej wersji Django

To trochę prostsze teraz, po prostu zrobić:

self.assertEqual(response.get('location'), '/url/we/expect') 

Sugerowałbym również użycie odwrotnej strony, aby wyszukać adres URL, którego oczekujesz od nazwy, jeśli mimo to jest to URL w Twojej aplikacji.

+1

Ostatnia linia zgłasza błąd w Django 1.4: 'AttributeError: 'Obiekt HttpResponseRedirect' nie ma atrybutu" META' " –

+2

Tak, zmieniono w wersji 1.4. Zamiast tego należy porównać 'response.get ('location')' z żądanym przekierowaniem. – aychedee

+0

Korzystanie z wersji 1.4.5 i META nie jest dostępne w odpowiedzi? – simi

17

Klasa Django TestCase ma metodę assertRedirects, której można użyć.

from django.test import TestCase 

class MyTestCase(TestCase): 

    def test_my_redirect(self): 
     """Tests that /my-url/ permanently redirects to /next-url/""" 
     response = self.client.get('/my-url/') 
     self.assertRedirects(response, '/next-url/', status_code=301) 

Kod stanu 301 sprawdza, czy jest to stałe przekierowanie.

+0

Czy to działa dla każdego, kto używa Django '<= 1.5.2"? Wygląda na to, że trafiłem [ten błąd] (https://bitbucket.org/kmike/django-webtest/issue/8/assertredirects-response-code-was-302). –

+0

@ JonasG.Drange łączysz się z raportem błędu dla wersji 1.5.2 aplikacji django-webtest, a nie samego Django. W mojej oryginalnej odpowiedzi zasugerowałem, że możesz użyć 'follow = False' w żądaniu pobierania, aby powstrzymać klienta od wykonania przekierowania. To było nieprawidłowe, więc usunąłem to. Metoda "assertRedirect" zawsze sprawdza stronę statusu, zgodnie z dokumentacją. Istnieje bilet [# 20919] (https://code.djangoproject.com/ticket/20919), aby zezwolić na 'assertRedirects' nie ładowanie strony docelowej. – Alasdair

+0

To ma więcej sensu. Dzięki. –

2

w Django 1.6, można użyć (nie zaleca):

from django.test import TestCase 
from django.http import HttpResponsePermanentRedirect 

class YourTest(TestCase): 
    def test_my_redirect(self): 
     response = self.client.get('/url-you-want-to-test/') 
     self.assertEqual(response.status_code, 301)# premant 301, temporary 302 
     self.assertTrue(isinstance(response, HttpResponsePermanentRedirect)) 
     self.assertEqual(response.get('location'), 'http://testserver/redirect-url/') 

zamiast po jest bardziej wydajny i zwięzłe i nie http://testserver/ potrzeba

from django.test import TestCase 

class YourTest(TestCase): 
    def test1(self): 
     response = self.client.get('/url-you-want-to-test/') 
     self.assertRedirects(
      response, '/redirect-url/',status_code=301,target_status_code=200)