尝试在 drf 中测试登录视图时出现未授权错误

问题描述 投票:0回答:0

我在 Django 休息框架中为我的登录视图编写了一个测试。这是测试:

class LoginViewTests(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            phone_number='09012345678',
            password='Test_1_Password'
        )

    def test_login(self):
        url = reverse('login')

        data = {
            'phone_number': '09012345678',
            'password': 'Test_1_Password'
        }

        response = self.client.post(url, data, format='json')

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

    def test_login_user_does_not_exist(self):
        url = reverse('login')

        data = {'phone_number': '09123456789', 'password': 'Test_1_Password'}

        response = self.client.post(url, data, format='json')

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

这是相关观点:

class LoginView(generics.GenericAPIView):
    serializer_class = LoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

和序列化器:

class LoginSerializer(serializers.Serializer):

    phone_number = serializers.CharField(max_length=13, required=True)
    password = serializers.CharField(max_length=50, required=True, write_only=True)
    tokens = serializers.SerializerMethodField(read_only=True)

    def get_tokens(self, obj):
        user = User.objects.get(phone_number=obj['phone_number'])
        return {
            'refresh': user.tokens()['refresh'],
            'access': user.tokens()['access']
        }

    class Meta:
        model = User
        fields = ['phone_number', 'password', 'tokens']

    def validate(self, attrs):
        phone_number = attrs.get('phone_number', '')
        password = attrs.get('password', '')
        user = auth.authenticate(phone_number=phone_number, password=password)
        if not user:
            raise AuthenticationFailed('Invalid credentials')
        if not user.is_active:
            raise AuthenticationFailed('Account disabled, contact admin')
        if not user.is_verified:
            raise AuthenticationFailed('phone number is not verified')
        return {
            'phone_number': user.phone_number,
            'tokens': user.tokens
        }

当我通过 postman 或 swagger 测试它时,登录成功,但是当我运行测试时,我得到错误 401 unauthorized。 你可以看到,我没有使用 IsAuthenticated 权限

我检查视图中的所有内容,序列化程序可能会出现问题,但一切看起来都很好,我还设置了权限 AllowAny 以查看,但结果相同。

django django-rest-framework django-rest-auth django-tests
© www.soinside.com 2019 - 2024. All rights reserved.