如何对“新风格”Django中间件进行单元测试

2024-09-29 21:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何联合测试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__


Tags: 中间件djangoselfgetinitresponserequestsession
1条回答
网友
1楼 · 发布于 2024-09-29 21:30:37

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

旧式和新式中间件之间的区别在于,新中间件只是一个可调用的,返回一个可调用的-首先使用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)
    

相关问题 更多 >

    热门问题