我正在学习如何对Django中间件进行单元测试。
在“旧风格”的中间件中,使用process_request()
加载中间件以测试结果非常容易。例如:
def test_session(self):
request = self.factory.get('/')
session_middleware = SessionMiddleware()
session_middleware.process_request(request)
// Do stuff
然而,在“新风格”中,这种情况不存在。例如,我该如何测试以下示例提供的Django文档?
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
使用
TimezoneMiddleware(request)
会调用__init__
但不会调用__call__
吗?
response = middleware(request)
时出现了AttributeError: 'WSGIRequest' object has no attribute 'session'
的错误? - alias51SessionMiddleware
是将会话对象附加到请求上的中间件:https://github.com/django/django/blob/master/django/contrib/sessions/middleware.py#L24 - 如果你正在测试依赖于会话中间件的其他中间件,你要么先使用会话中间件,要么在请求上模拟.session
属性。 - samuTimezoneMiddleware
,它需要一个会话。 - alias51tzname = request.session.get('django_timezone')
- 这需要先将一个会话附加到请求上。 - samu