Django REST - 如何制作一个测试用例来检查方法是否被允许?

Django REST - How to make a test case that checks that a method is not allowed?

我有以下模型视图集:

class OrderViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):

我想创建四个测试用例:

我面临几个问题。首先,我无法对所有测试用例使用 reverse() 。以下测试用例有效:

def test_disable_read_order_list(self):
    response = self.client.get(reverse('api:orders-list', kwargs={'currency': 'eur'}))
    self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) 

当我尝试使用 reverse 获取详细路线的 URL 时:

reverse('api:orders-detail', kwargs={'currency': 'eur', 'pk': self.order.id})

我得到:

django.urls.exceptions.NoReverseMatch: Reverse for 'orders-detail' not found. 'orders-detail' is not a valid view function or pattern name.

我试图通过调整用于工作测试用例的 URL 来解决这个问题:

def test_disable_read_order_detail(self):
    response = self.client.get(reverse('api:orders-list', kwargs={'currency': 'eur'}) + str(self.order.id) + '/')
    self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

但由于某种原因返回了状态码 200。

实现我想要的单元测试的正确方法是什么?

django.urls.exceptions.NoReverseMatch: Reverse for 'orders-detail' not found. 'orders-detail' is not a valid view function or pattern name.OrderViewSet 实现方式的结果。

它源自 mixins.CreateModelMixinviewsets.GenericViewSet,因此可以创建订单,但除此之外别无他法(这就是 test_disable_read_order_list 通过的原因)。

您应该得到 404 Not Found,除非 OrderViewSet 继承自 mixins.RetrieveModelMixin,当您尝试请求订单详细信息时(例如 /orders/1/),因此您很奇怪在 test_disable_read_order_detail.

中获得 200 OK