我正在学习如何对 Django 中间件进行单元测试。
在“旧式”中间件中,使用以下命令加载中间件非常容易process_request()
测试结果。例如。
def test_session(self):
request = self.factory.get('/')
session_middleware = SessionMiddleware()
session_middleware.process_request(request)
// Do stuff
然而,在“新风格”中,这并不存在。例如,我将如何测试以下示例Django 文档 https://docs.djangoproject.com/en/3.0/topics/i18n/timezones/#selecting-the-current-time-zone提供?
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)
Using TimezoneMiddleware(request)
将调用__init__
但不是__call__
?
正如你所看到的,中间件简单地实现了一个__call__
魔法方法。这意味着该类的实例是callable.
旧式中间件和新式中间件之间的区别在于,新中间件只是一个返回可调用对象的可调用对象 - 首先您使用get_response
回调,然后使用实际请求调用返回的可调用对象。get_response
是由 Django 本身提供/注入的可调用函数,它是一个用于返回视图响应或链中下一个中间件的函数。
所以,为了测试你的SessionMiddleware
,您可以执行以下操作:
import mock
def test_middleware(self):
get_response = mock.MagicMock()
request = self.factory.get('/')
middleware = SessionMiddleware(get_response)
response = middleware(request)
# ensure get_response has been returned
# (or not, if your middleware does something else)
self.assertEqual(get_response.return_value, response)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)