使用 url_path 中的参数测试 DRF GenericViewSet

时间:2021-07-08 23:35:45

标签: python django testing django-rest-framework

我正在尝试使用 unittest 测试 DRF 端点。查看下测试:

class HwView(mixins.ListModelMixin, viewsets.GenericViewSet):

    @action(detail=False, methods=['get'], url_path='switch_state/(?P<switch_id>\d+)')
    def switch_state(self, request, switch_id):
        print(f'sw: {switch_id}')
        
        results = {"state": 'ok'}

        return Response(results)

在 url.py 中输入

from rest_framework import routers
router = routers.DefaultRouter()

router.register(r'hw', hw_views.HwView, basename='HwModel')

和测试代码

from rest_framework.test import APIRequestFactory, APITestCase


class TestCommandProcessor(APITestCase):
    def setUp(self):
        pass

    def test_switch_state(self):
        factory = APIRequestFactory()
        request = factory.get(
            '/api/hw/switch_state/3',
        )

        view = HwView.as_view({'get': 'switch_state'}, basename='HwModel')

        response = view(request)

        self.assertIn('state', response.data)
        self.assertEqual('ok', response.data['state'])

运行测试时出现错误:

TypeError: switch_state() missing 1 required positional argument: 'switch_id'

此视图中的任何其他方法(不带参数的 GET、带参数的 POST)都可以使用相同的测试方法正常工作。

你能帮我找出为什么我的视图无法解析 URL 中的参数吗?或者关于如何重写我的测试以成功测试我的代码的任何建议。

1 个答案:

答案 0 :(得分:1)

试试

response = view(request, switch_id=3)

response = view(request, {"switch_id": 3})