Django测试客户端:如何移除HTTP头部
我正在尝试为一段代码编写单元测试,这段代码用来检查是否缺少某个头信息。请问我该如何在Django的测试客户端中省略http_referer头信息(或者其他任何头信息)呢?
def testCase(self):
response = self.client.get('/some_url/')
self.assertNotEqual(500, response.status_code)
2 个回答
-1
在这种情况下,不要通过测试客户端来进行测试。如果你修改了测试客户端的行为,然后通过它发起请求,那你就不是在用实际会处理的输入来测试你的代码。
你不应该指望测试客户端能以和WSGI客户端完全相同的方式构建HTTP请求。它能把请求参数传递到你的视图中,这已经足够了,但这和真实请求得到的结果肯定是不一样的。
测试客户端的目的是让你不必关注真实请求和响应对象的复杂细节,只需要测试你的视图如何响应输入参数。不过在你的情况下,你需要关注这些细节。
你应该像Django那样构建一个HTTPRequest对象——使用尽可能多的Django函数来构建它,然后直接用这个HTTPRequest对象调用你的视图或中间件。如果你的视图应该抛出异常,那就用assertRaises来测试。如果它应该返回一个状态码为500的HTTPResponse,那就测试这个——或者如果需要的话,使用自定义的assert方法一起测试它们。
2
你可以不用内置的测试客户端,而是使用 Django的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)