gpt4 book ai didi

python - 如何修复更改密码 View 的测试(Django REST Framework)?

转载 作者:行者123 更新时间:2023-11-28 19:03:40 25 4
gpt4 key购买 nike

看来,测试并没有将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 处停止?

最佳答案

我猜你误会了用户。

这可能会解决您的问题:

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)

关于python - 如何修复更改密码 View 的测试(Django REST Framework)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com