2012-07-27 79 views

回答

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

还有其他属性的回应可能会有趣的测试。如果你不确定是什么对象,那么你总是可以做一个

print dir(response) 

编辑Django的的当前版本

这是一个有点简单了,只是做:

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

我还建议使用reverse来查找你期望从一个名字得到的url,如果它是你应用中的url。

+1

最后一行在Django 1.4中抛出一个错误:'AttributeError:'HttpResponseRedirect'对象没有任何属性'META'' – 2013-03-27 20:38:59

+2

是的,在1.4中改变了。相反,你会比较'response.get('location')'和你想要的重定向url。 – aychedee 2013-03-28 08:41:54

+0

使用1.4.5和META不可用作为响应? – simi 2014-04-09 18:58:49

17

Django TestCase类有一个方法​​,您可以使用。

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) 

状态码301检查它是永久重定向。

+0

这是否适用于任何使用Django'<= 1.5.2'的人?看来我已经击中了[这个bug](https://bitbucket.org/kmike/django-webtest/issue/8/assertredirects-response-code-was-302)。 – 2013-09-04 20:45:20

+0

@ JonasG.Drange您将链接到应用程序django-webtest版本1.5.2的错误报告,而不是Django本身。在我最初的回答中,我确实建议你可以在get请求中使用'follow = False'来阻止客户端遵循重定向。这是不正确的,所以我删除了它。按照记录,“assertRedirect”方法总是检查状态页面。有一张票[#20919](https://code.djangoproject.com/ticket/20919)允许'assertRedirects'不加载目标页面。 – Alasdair 2013-09-05 00:05:23

+0

这样做更有意义。谢谢。 – 2013-09-05 05:58:21

2

在Django 1.6,您可以使用(不推荐):

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

代替,下面是更强大,更简洁,没有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)