2012-07-27 8 views

Respuesta

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

Existen otros atributos de la respuesta que pueden ser interesantes de probar. Si no está seguro de lo que está en el objeto, entonces siempre se puede hacer una edición

print dir(response) 

PARA LAS VERSIONES ACTUALES DE DJANGO

Es un poco más simple ahora, acaba de hacer:

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

También te sugiero que uses el reverso para buscar la URL que esperas de un nombre, si es una url en tu aplicación de todos modos.

+1

La última línea arroja un error en Django 1.4: 'AttributeError: 'HttpResponseRedirect' objeto no tiene atributo 'META'' –

+2

Sí, cambiado en 1.4 parece. En su lugar, compararía 'response.get ('location')' con su URL de redirección deseada. – aychedee

+0

El uso de 1.4.5 y META no está disponible en respuesta ??? – simi

17

La clase Django TestCase tiene un método assertRedirects que puede usar.

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) 

El código de estado 301 comprueba que se trata de un redireccionamiento permanente.

+0

¿Funciona esto para cualquiera que use Django '<= 1.5.2'? Parece que he golpeado [este error] (https://bitbucket.org/kmike/django-webtest/issue/8/assertredirects-response-code-was-302). –

+0

@ JonasG.Drange, usted está enlazando a un informe de error para la versión 1.5.2 de la aplicación django-webtest, no a Django en sí. En mi respuesta original, sugerí que pudiera usar 'follow = False' en la solicitud get para evitar que el cliente siga la redirección. Eso fue incorrecto, así que lo eliminé. El método 'assertRedirect' siempre verifica la página de estado, como está documentado. Hay un ticket [# 20919] (https://code.djangoproject.com/ticket/20919) para permitir que 'assertRedirects' no cargue la página de destino. – Alasdair

+0

Eso tiene más sentido. Gracias. –

2

En Django 1.6, se puede utilizar (no se recomienda ):

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

lugar, siguiendo es más potente y concisa y sin necesidad http://testserver/

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) 
Cuestiones relacionadas