7

我正在为我的 django 应用程序编写一些测试。在我看来,它使用“HttpResponseRedirect”重定向到其他一些 url。那么我该如何测试呢?

4

3 回答 3

21

DjangoTestCase类有一个assertRedirects可以使用的方法。

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 检查它是否是永久重定向。

于 2012-07-27T09:07:05.603 回答
15
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。

于 2012-07-27T07:38:04.173 回答
1

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

instead, following is more powerful and concise and no http://testserver/ need

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)
于 2014-05-31T03:19:44.707 回答