考虑到我有一个简单的 APIView 如下,
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"})
请注意,视图函数post(...)由装饰器包装@my_custom_decorator。不,我想为这个 API 编写测试,我试过这样
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"})
这没有@my_custom_decorator正确模拟,因此给了我一个例外。
问题:如何模拟@my_custom_decorator以检索成功的响应?
笔记
- 我看过这篇 SO 帖子,我可以在 Python 装饰器包装函数之前对其进行修补吗?,我觉得帖子缺少一些例子,
更新 - 1
仅当测试模块在视图模块初始化之前初始化时,此答案才有效。AFAIK,这种加载在 Django 中是不可配置的。