Как протестировать новые классы 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