我是Django和Django Rest框架的新手。
我想知道如何测试自定义操作。例如,假设我们有来自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
这意味着给定的方法是不允许的。
有没有人能帮我找出错误是什么?
发布于 2020-08-26 09:13:15
你在这里犯了一个错误
request = factory.post(request_url)
应该是put
request = factory.put(request_url)
而且,您应该将数据添加到请求正文中。在这一行中,您试图从request对象中获取data
。
serializer = PasswordSerializer(data=request.data)
此数据依赖于PasswordSerializer
;但例如,它应该是这样的(它应该包含序列化程序的所有参数):
request = factory.put(request_url, {'password': 'sTr0ngPass'})
https://stackoverflow.com/questions/63594198
复制