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'))

Вернуться на верх