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
相关产品推荐
相关产品推荐

