Тесты 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
Вернуться на верх