Django测试客户端:如何移除HTTP头部

5 投票
2 回答
2961 浏览
提问于 2025-04-17 12:17

我正在尝试为一段代码编写单元测试,这段代码用来检查是否缺少某个头信息。请问我该如何在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)

撰写回答