[英]Authentication fails during login testing
我正在嘗試測試自定義登錄(使用 pytest),但身份驗證失敗返回無。 這是views.py
from rest_framework.authtoken.views import ObtainAuthToken
from my_auth.api.serializers import UserLoginSerializer
class LoginAuthToken(ObtainAuthToken):
serializer_class = UserLoginSerializer
序列化程序.py
from django.contrib.auth import authenticate
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.authtoken.serializers import AuthTokenSerializer
class UserLoginSerializer(AuthTokenSerializer):
username = None
email = serializers.EmailField(
label=_("Email"),
)
def validate(self, attrs):
email = attrs.get('email')
password = attrs.get('password')
if email and password:
user = authenticate(request=self.context.get('request'),
email=email, password=password) # returns None
if not user:
msg = _('Unable to log in with provided credentials.')
raise serializers.ValidationError(msg, code='authorization') # raises
else:
msg = _('Must include "email" and "password".')
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
return attrs
測試.py
import pytest
from django.urls import reverse
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient
@pytest.fixture
def test_user():
user = MyUser.objects.create(
email='test@m.com',
first_name='Firstname',
last_name='Lastname'
)
user.set_password('pass5678')
return user
@pytest.mark.django_db
def test_login(test_user):
client = APIClient()
response = client.post(
path=reverse('login'),
data={
'email': 'test@m.com',
'password': 'pass5678',
},
format='json',
)
assert(response.status_code == status.HTTP_200_OK)
token = Token.objects.get(user=test_user)
assert(token.key == response.data['token'])
端子 output:
========================================================================================================== test session starts ==========================================================================================================
platform linux -- Python 3.8.5, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
django: settings: news_project.settings (from ini)
rootdir: /home/andrei/NEWS/news_project, configfile: pytest.ini
plugins: lambda-1.2.4, Faker-8.4.0, common-subject-1.0.5, assert-utils-0.2.2, drf-1.1.2, fixture-order-0.1.3, django-4.3.0
collected 2 items
my_auth/tests.py F [ 50%]
news/tests.py . [100%]
=============================================================================================================== FAILURES ================================================================================================================
______________________________________________________________________________________________________________ test_login _______________________________________________________________________________________________________________
test_user = <MyUser: test@m.com>
@pytest.mark.django_db
def test_login(test_user):
client = APIClient()
response = client.post(
path=reverse('login'),
data={
'email': 'test@m.com',
'password': 'pass5678',
},
format='json',
)
> assert(response.status_code == status.HTTP_200_OK)
E assert 400 == 200
E + where 400 = <Response status_code=400, "application/json">.status_code
E + and 200 = status.HTTP_200_OK
my_auth/tests.py:78: AssertionError
----------------------------------------------------------------------------------------------------------- Captured log call -----------------------------------------------------------------------------------------------------------
WARNING django.request:log.py:224 Bad Request: /api/auth/login/
======================================================================================================== short test summary info ========================================================================================================
FAILED my_auth/tests.py::test_login - assert 400 == 200
====================================================================================================== 1 failed, 1 passed in 3.63s ======================================================================================================
當我在 test_login 中執行print(response.data)
時,這是 output
{'non_field_errors': [ErrorDetail(string='Unable to log in with provided credentials.', code='authorization')]}
一開始我以為rest_framework.request.Request object沒有傳遞給UserLoginSerializer的validate(),但實際上是這樣。 此外,它與我通過 Postman 發送 POST 請求時獲得的請求幾乎相同。 我錯過了什么?
調用set_password
后,您仍然需要調用save
the user :
@pytest.fixture
def test_user():
user = MyUser.objects.create(
email='test@m.com',
first_name='Firstname',
last_name='Lastname'
)
user.set_password('pass5678')
user.save()
return user
https://docs.djangoproject.com/en/3.2/ref/contrib/auth/#django.contrib.auth.models.User.set_password
將用戶的密碼設置為給定的原始字符串,注意密碼散列。 不保存用戶 object。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.