【问题标题】: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,然后测试它 -- 或者如果需要,可以使用自定义断言方法测试它们。