gpt4 book ai didi

python - 如何单元测试 "new style"Django 中间件

转载 作者:行者123 更新时间:2023-12-02 16:34:30 25 4
gpt4 key购买 nike

我正在学习如何对 Django 中间件进行单元测试。

在“旧式”中间件中,使用 process_request() 加载中间件来测试结果非常容易。例如

def test_session(self):
request = self.factory.get('/')
session_middleware = SessionMiddleware()
session_middleware.process_request(request)
// Do stuff

然而,在“新风格”中这并不存在。例如,我将如何测试以下示例 Django docs提供?

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__?

最佳答案

如您所见,中间件只是实现了一个__call__ 魔法方法。这意味着此类的实例是可调用的

旧式和新式中间件的区别在于,新式中间件只是一个返回可调用对象的可调用对象 - 首先用 get_response 回调调用它,然后调用返回可调用的实际请求。 get_response 是由 Django 本身提供/注入(inject)的可调用函数,它是一个用于返回 View 响应或链中下一个中间件的函数。

因此,为了测试您的 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)

关于python - 如何单元测试 "new style"Django 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62944755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com