Django Middleware не изменяет запрос в тестах
Я пытаюсь создать тестовый класс для моего пользовательского промежуточного ПО. Проект использует фреймворк Django REST. Класс middleware работает нормально, когда сервер запущен, но когда я запускаю тест, он ведет себя не совсем так, как я ожидаю. Возможно, я что-то не так понял, поскольку я совсем новичок в тестировании на Django.
my_middleware.py:
class FX:
a = False
b = None
c = ''
def __init__(self) -> None:
pass
def __str__(self):
return 'fx ok'
class MyMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
request.fx = FX()
response = self.get_response(request)
print('done')
return response
views.py:
class TestView(APIView):
def get(self, request, format=None):
print('View ok')
print('FX: ', request.fx)
return Response({'result':'ok'})
tests.py:
class TestMyMiddleware(APITestCase):
@classmethod
def setUpTestData(cls):
pass
def setUp(self):
pass
def test_fx(self):
response = self.client.get(reverse('TestView'), content_type="application/json")
request = response.request
self.assertTrue(hasattr(request, 'fx'))
Приведенный выше код фактически запускает промежуточное ПО. Он печатает "done" в форме вызова промежуточного ПО, затем печатает 'View ok' и также печатает экземпляр FX. Однако request.fx недоступен в методе test_fx, что приводит к отказу утверждения:
self.assertTrue(hasattr(request, 'fx'))
AssertionError: False is not true
Есть идеи, что я могу делать неправильно?
Вам необходимо получить доступ к объекту запроса из ответа с помощью response.wsgi_request
вместо response.request
.
class TestMyMiddleware(APITestCase):
@classmethod
def setUpTestData(cls):
pass
def setUp(self):
pass
def test_fx(self):
response = self.client.get(reverse('TestView'), content_type="application/json")
request = response.wsgi_request
self.assertTrue(hasattr(request, 'fx'))