我将现有的中间件升级到新的1.10+风格的Django中间件。

以前是这样的:

class ThreadLocalMiddleware(MiddlewareMixin):
    """ Simple middleware that adds the request object in thread local storage."""

    _thread_locals = local()

    def process_request(self, request):
        _thread_locals.request = request

    def process_response(self, request, response):
        if hasattr(_thread_locals, 'request'):
            del _thread_locals.request
        return response

    def process_exception(self, request, exception):
        if hasattr(_thread_locals, 'request'):
            del _thread_locals.request


重写为新样式后:

class ThreadLocalMiddleware:

    _thread_locals = local()

    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        _thread_locals.request = request

        response = self.get_response(request)

        if hasattr(_thread_locals, 'request'):
            del _thread_locals.request
        return response

    def process_exception(self, request, exception):
        if hasattr(_thread_locals, 'request'):
            del _thread_locals.request


我的问题是如何对中间件在request中设置_thread_locals进行单元测试?以前,这与在单元测试中调用process_request方法一样容易。现在,我只有__call__方法,该方法将最后删除该变量。

看着django中间件测试,他们仍然使用向后兼容的类,允许他们保留旧的测试,我想知道在删除它之后如何测试它。

最佳答案

最后,我使用了与此类似的测试。中间件的预请求工作完成后,将调用get_response_callback

def test_middleware():

    def get_response_callback(req):
        assert ThreadLocalMiddleware._thread_locals.request

    middleware = ThreadLocalMiddleware(get_response_callback)
    request = RequestFactory().get('/')
    request.user = AnonymousUser()

    middleware(request)
    assert hasattr(ThreadLocalMiddleware._thread_locals, 'request') == False

10-07 19:04
查看更多