Django测试客户端:如何删除http标头

时间:2012-02-03 19:14:53

标签: python django unit-testing http-headers

我正在尝试为一段代码编写单元测试,以检查是否缺少标头。如何从Django的测试客户端中省略http_referer标头(或任何标题)?

def testCase(self):
    response = self.client.get('/some_url/')
    self.assertNotEqual(500, response.status_code)

2 个答案:

答案 0 :(得分:3)

您可以使用Django's RequestFactory来构建您的请求,然后在调用函数之前修改请求对象,而不是使用内置的测试客户端:

from django.test.client import RequestFactory
from django.test import TestCase

from yourapp.view import yourfunction

class YourTest(TestCase)
    def setUp(self):
        self.factory = RequestFactory()

    def testCase(self):
        request = self.factory.get('/yoururl/')
        del request.META['HTTP_REFERER']
        yourfunction(request)

答案 1 :(得分:0)

在这种情况下,不要通过测试客户端。如果修改测试客户端的行为,然后通过它发出请求,则不会针对实际必须处理的输入测试代码。

您不应该信任测试客户端以与WSGI客户端完全相同的方式构造HTTP请求。它可以很好地将请求参数放入您的视图中,但它肯定与您从实际请求中获得的参数不同。

测试客户端的目的是保护您免受实际请求和响应对象的所有混乱细节的影响,并让您测试视图如何响应输入参数。但是,在您的情况下,您需要测试这些细节。

您应该像Django一样构建HTTPRequest对象 - 使用构建它所需的Django函数,然后直接使用该HTTPRequest对象调用您的视图或中间件。如果您的视图应该引发异常,那么使用assertRaises来测试它。如果它应该返回状态代码设置为500的HTTPResponse,那么测试一下 - 或者如果需要的话,用自定义断言方法测试它们。