【问题标题】:Django Test Client: How to remove http headersDjango 测试客户端:如何删除 http 标头
【发布时间】:2012-02-03 19:14:53
【问题描述】:

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

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

【问题讨论】:

    标签: python django unit-testing http-headers


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

      【解决方案2】:

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

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

      测试客户端的目的是让您远离真实请求和响应对象的所有杂乱细节,并让您测试您的视图如何响应输入参数。但是,在您的情况下,您需要测试这些细节。

      您应该以与 Django 相同的方式构建 HTTPRequest 对象——使用尽可能多的 Django 函数来构建它,然后直接使用该 HTTPRequest 对象调用您的视图或中间件。如果您的视图应该引发异常,则使用 assertRaises 对其进行测试。如果它应该返回一个状态码设置为 500 的 HTTPResponse,然后测试它 -- 或者如果需要,可以使用自定义断言方法测试它们。

      【讨论】:

        猜你喜欢
        • 2015-11-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 2020-01-15
        • 2013-09-24
        • 1970-01-01
        相关资源
        最近更新 更多