You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中间件单元测试报错求助(附中间件代码)

Django中间件单元测试报错排查与解决方案

我来帮你搞定这个HeadersControlMiddleware的单元测试问题,先把你的代码摆出来,再聊聊常见的报错场景和解决办法:

我的中间件代码

class HeadersControlMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 一次性配置与初始化
    def __call__(self, request):
        # 视图及后续中间件调用前执行的代码
        response = self.get_response(request)
        response['Cache-Control'] = "no-cache"
        # 视图调用后针对每个请求/响应执行的代码
        return response

未完成的单元测试代码

class TestHeadersControlMiddleware(TestCase):
    # 这里是未完成的测试逻辑,运行时出现报错

常见报错场景与修复方案

1. 未正确模拟get_response依赖

中间件的__init__方法必须接收get_response参数,测试时如果没有正确模拟这个函数,会直接导致初始化失败或者后续调用报错。用Python的unittest.mock.MagicMock就能轻松解决:

from django.test import TestCase
from unittest.mock import MagicMock
from your_app_name.middleware import HeadersControlMiddleware

class TestHeadersControlMiddleware(TestCase):
    def test_cache_control_header_is_set(self):
        # 模拟一个返回响应的get_response函数
        mock_get_response = MagicMock()
        # 模拟响应对象,支持字典式赋值header
        mock_response = MagicMock()
        mock_response.__setitem__ = MagicMock()
        mock_get_response.return_value = mock_response

        # 初始化中间件
        middleware = HeadersControlMiddleware(mock_get_response)
        # 模拟请求对象
        mock_request = MagicMock()

        # 触发中间件调用
        response = middleware(mock_request)

        # 验证逻辑是否正确执行
        mock_get_response.assert_called_once_with(mock_request)
        mock_response.__setitem__.assert_called_once_with('Cache-Control', 'no-cache')

2. 更贴近真实场景的客户端测试

如果不想用Mock,也可以直接启用中间件,用Django测试客户端发起请求,直接检查真实响应的Header:

from django.test import TestCase, Client

class TestHeadersControlMiddleware(TestCase):
    def test_response_has_no_cache_header(self):
        client = Client()
        # 替换成你项目里的任意可访问视图路径
        response = client.get('/')
        # 验证响应头是否符合预期
        self.assertEqual(response['Cache-Control'], 'no-cache')

3. 常见报错:AttributeError: 'NoneType' object has no attribute '__setitem__'

这个错误大概率是因为你模拟的get_response返回了None,导致中间件里response['Cache-Control']这一行无法执行。解决办法就是确保get_response返回的是一个支持字典式赋值的对象——要么用Django原生的HttpResponse,要么像上面那样给Mock对象配置__setitem__方法。

内容的提问来源于stack exchange,提问作者user2880391

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:26:52