【问题标题】:How to write a test for a custom action on a viewset in Django Rest Framework如何在 Django Rest Framework 中为视图集上的自定义操作编写测试
【发布时间】:2020-08-26 09:03:28
【问题描述】:

我是 Django 和 Django Rest Framework 的新手。

我想知道如何测试自定义操作。例如,假设我们有以下 DRF 教程中的代码

class UserViewSet(viewsets.ModelViewSet):
    """
    A viewset that provides the standard actions
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @action(detail=True, methods=['post', 'put'])
    def set_password(self, request, pk=None):
        user = self.get_object()
        serializer = PasswordSerializer(data=request.data)
        if serializer.is_valid():
            user.set_password(serializer.data['password'])
            user.save()
            return Response({'status': 'password set'})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

我将如何在 DRF 的测试中调用此视图。

def test_password_set(self):
    user = User.objects.create(name="Joe")
    factory = APIRequestFactory()
    request_url = f'users/{user.id}/set_password/'
    request = factory.post(request_url)

    view = UserViewSet.as_view({'put': 'update'})
    response = view(request)
    self.assertEqual(response.status_code, 200)

该代码给了我下面的错误

AssertionError: 405 != 200

这意味着给定的方法是不允许的。

谁能帮我弄清楚错误可能是什么?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你在这里犯了一个错误

    request = factory.post(request_url)
    

    应该是put:

    request = factory.put(request_url)
    

    此外,您应该将数据添加到请求正文中。在这一行中,您尝试从请求对象中获取 data

    serializer = PasswordSerializer(data=request.data)
    

    这个数据依赖于PasswordSerializer;但是例如,它应该是这样的(它应该包含序列化器的所有参数):

    request = factory.put(request_url, {'password': 'sTr0ngPass'})
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 2019-01-05
      • 2018-10-18
      • 1970-01-01
      • 2014-09-14
      • 2015-01-10
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多