Thursday, 22 April 2021

How to mock view decorator in Django

Consider that I have a simple APIView as below,

from rest_framework.views import APIView
from rest_framework.response import Response


def my_custom_decorator(func):
    def wrap(view, request):
        if request.method.lower():
            raise ValueError("Just for testing")
        return func(view, request)

    return wrap


class SomeAPIView(APIView):

    @my_custom_decorator
    def post(self, request):
        return Response({"message": "Success"})

Note that the view function post(...) is wrapped by the decorator @my_custom_decorator. Noe, I want to write the test for this API and I tried like this

from rest_framework.test import APITestCase
from django.urls import reverse
from unittest.mock import patch


class TestSomeAPIView(APITestCase):

    @patch("sample.views.my_custom_decorator")
    def test_decorator(self, mock_my_custom_decorator):
        url = reverse("some-api-view")
        response = self.client.post(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json(), {"message": "Success"})

This didn't mock the @my_custom_decorator properly and thus gave me an exception.

Question: How can I mock the @my_custom_decorator to retrieve a successful response?

Notes

Update - 1

This answer will work only if the test module gets initialized before the initialization of the view module. AFAIK, this kind of loading isn't configurable in Django.



from How to mock view decorator in Django

No comments:

Post a Comment