如何修复更改密码视图的测试(Django REST框架)?

3

在这个视图中,测试没有将request.data作为DRF的元素。

以下是该视图代码:

class ChangePasswordView(UpdateAPIView):

    serializer_class = ChangePasswordSerializer
    model = UserInfo
    permission_classes = (IsAuthenticated,)

    def get(self, request, *args, **kwargs):
        return Response(status=200)

    def put(self, request, *args, **kwargs):
        self.object = self.request.user
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            if not self.object.check_password(serializer.data.get("old_password")):
                return Response(
                    {"old_password": ["Wrong password"]},
                    status=400
                )
            self.object.set_password(serializer.data.get("new_password"))
            self.object.save()
            return Response("Success", status=200)

        return Response(serializer.errors, status=400)

我有这个测试方法:

def test_change_password(self):
    client = APIClient()
    self.client.post('/api/user/login/', self.data, follow=True)
    self.client.login(username="testuser", password="secret")
    request = client.put('/api/user/change_password/', self.new_data)

    self.assertEqual(
         request, '<Response status_code=200, "application/json">'
    )

数据在哪里:

def setUp(self):
    self.data = {
        'username': 'testuser',
        'password': 'secret'
    }

    self.new_data = {
        'old_password': 'secret',
        'new_password': 'other_secret'
    }

    User.objects.create_user(**self.data)

为什么测试在serializer = self.get_serializer(data=request.data)的reqest.data处停止?
1个回答

0

我猜你误解了用户意图。

这个方法或许能解决你的问题:

from rest_framework import status

class ChangePasswordView(UpdateAPIView):

serializer_class = ChangePasswordSerializer
model = UserInfo
permission_classes = (IsAuthenticated,)

def get(self, request, *args, **kwargs):
    return Response(status=status.HTTP_200_OK)

def post(self, request, *args, **kwargs):
    user = request.user
    serializer = self.get_serializer(data=request.data)

    if serializer.is_valid():
        if not self.object.check_password(serializer.data.get("old_password")):
            msg = _("Wrong old password.")
            raise ValidationError(msg)

        user.set_password(serializer.data.get("new_password"))
        user.save()
        return Response("Success", status=status.HTTP_200_OK)

    msg = _('Something went wrong while reading the passwords')
    raise ValidationError(msg)

我正在使用从rest_framework导入的status,以便更轻松地处理错误代码。

你使用put有什么特定的原因吗?我已经将其更改为post。在进行此API调用(更改密码)时,应该使用post。

您可以轻松地通过request.user获取用户,然后在put函数内使用变量user设置密码并保存它。

关于测试用例,这可能对您有所帮助和/或工作。如果不起作用,您可能需要稍微更改一下。

from rest_framework import status

def test_change_password(self):
    client = APIClient()
    self.client.post('/api/user/login/', self.data, follow=True)
    self.client.login(username="testuser", password="secret")
    response = self.post('/api/user/change_password/', self.new_data)

    self.assertEqual(response.status_code, status.HTTP_200_OK)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接