【发布时间】:2021-07-12 15:29:35
【问题描述】:
假设我有一个简单的 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帖子,Can I patch a Python decorator before it wraps a function?,感觉帖子缺少一些例子,
更新 - 1
This answer 仅在测试模块在视图模块初始化之前被初始化时才起作用。 AFAIK,这种加载在 Django 中是不可配置的。
【问题讨论】:
标签: python django unit-testing django-rest-framework mocking