【问题标题】:How to unittest "new style" Django middleware如何对“新型”Django 中间件进行单元测试
【发布时间】:2020-07-16 23:04:27
【问题描述】:

我正在学习如何对 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__

【问题讨论】:

    标签: python django django-testing django-middleware django-tests


    【解决方案1】:

    如您所见,中间件简单地实现了一个__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)
        
    

    【讨论】:

    • 谢谢,这会返回 response = middleware(request)AttributeError: 'WSGIRequest' object has no attribute 'session'
    • 你在测试什么中间件?因为SessionMiddleware 是将会话对象附加到请求的那个:github.com/django/django/blob/master/django/contrib/sessions/… - 如果您正在测试另一个依赖于会话中间件的中间件,您必须首先使用会话中间件或模拟 .session 属性请求。
    • 我正在测试问题中显示的TimezoneMiddleware,需要会话吗?
    • 是的,您可以在这一行中看到它:tzname = request.session.get('django_timezone') - 它需要事先将会话附加到请求。
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 2013-09-29
    • 2016-12-16
    • 2010-11-24
    • 2011-02-23
    • 2018-10-09
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多