Как протестировать новые классы Django 1.10+ MIDDLEWARE

Я обновляю существующее промежуточное ПО до нового промежуточного программного обеспечения Django 1.10+.

Ранее это было похоже на это:

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, они по-прежнему используют класс обратной совместимости, позволяющий им сохранять старые тесты. Интересно, как они будут тестировать его после его удаления.

1 ответ

Решение

В конце концов, я использовал тест, похожий на этот. 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
Другие вопросы по тегам