Тесты Django не изолируются при тестировании аутентификации
Я тестирую аутентификацию с помощью django.test.Client
и два теста не работают, потому что как только я тестирую свой тест test_login_success
, другие тесты не работают, потому что пользователь остается аутентифицированным, даже когда я инстанцирую нового клиента в классе setUp
и даже удаляю пользователя в tearDown
.
Мой код:
from django.test import Client, TestCase
from app.users.models import User
class TestLogin(TestCase):
def setUp(self):
super().setUp()
self.email = 'test@test.com'
self.password = 'SomeRandomPass96'
User.objects.create_user(email=self.email, password=self.password)
self.client = Client()
def tearDown(self):
User.objects.filter(email=self.email).delete()
super().tearDown()
def test_not_authenticated(self): # success the first time, fails after test_login_success is executed for the first time.
user = User.objects.get(email=self.email)
assert not user.is_authenticated
def test_login_success(self): # always success
self.client.post(
'/users/login/',
{'email': self.email, 'password': self.password}
)
user = User.objects.get(email=self.email)
assert user.is_authenticated
def test_login_wrong_credentials(self): # success the first time, fails after test_login_success is executed for the first time.
self.client.post(
'/users/login/',
{'email': self.email, 'password': 'wrongPassword123'}
)
user = User.objects.get(email=self.email)
assert not user.is_authenticated
Возможно, вы можете использовать метод logout
из класса Client.
этот метод "Выйти из пользователя, удалив куки и объект сессии."
Скажите мне, если это сработает.
Ошибка: user.is_authenticated
не делает того, что ожидается в этом коде. Поскольку пользователь в request
объекте в представлении будет AnonymousUser
или User
экземпляром в зависимости от того, аутентифицирован ли он, а я обращался непосредственно к экземпляру User из базы данных.
Правильным способом является обращение к пользователю из объекта запроса, а поскольку в тестовом примере у нас нет контекста представления, Django предоставляет его возврат в ответе следующим образом:
def test_not_authenticated(self):
response = self.client.get('')
user = response.wsgi_request.user
assert not user.is_authenticated