Próbuję napisać test do wylogowania użytkownika w Django. Oto kod:

Urls.py

from django.conf.urls import url
from django.contrib import admin
from accounts.views import LoginView, LogoutView


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', LoginView.as_view(), name='login'),
    url(r'^logout/', LogoutView.as_view(), name='logout'),
]

Views.py

from django.http import HttpResponseRedirect
from django.contrib.auth import login, logout
from django.views.generic import View


class LogoutView(View):
    def get(self, request):
        logout(request)
        return HttpResponseRedirect('/')

Testys.py.

from django.test import TestCase, Client
from django.contrib.auth.models import User


class LogoutTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user(
            username='user1',
            email='user1_123@gmail.com',
            password='top_secret123'
        )

    def test_user_logs_out(self):
        self.client.login(email=self.user.email, password=self.user.password)
        self.assertTrue(self.user.is_authenticated)

        response = self.client.get('/logout/')

        self.assertFalse(self.user.is_authenticated)
        self.assertRedirects(response, '/', 302)

Asercja self.assertFalse(self.user.is_authenticated) nie zawodzi. Testowanie przez przeglądarkę wydaje się działać dobrze. Wygląda na to, że użytkownik nie zostałby uwierzytelniony po zwanym wylogowaniu (). Brakowam czegoś?

1
Joe Fearnley 18 październik 2020, 16:39

1 odpowiedź

Najlepsza odpowiedź

Wygląda na to, że użytkownik nie zostanie uwierzytelniony po nazwie logout(). Brakowam czegoś?

{{ X0}} [Django-doc] robi nie Sprawdź, czy użytkownik jest zalogowany. Każda real User zwraca zawsze { {X2}} dla is_authenticated. {x4}} [Django-doc] powróci na przykład False. Jeśli zatem wylogujesz, a następnie request.user będzie AnonymousUser, a zatem nie jest uwierzytelniony.

Innymi słowy, jeśli używasz request.user.is_authenticated, zadzwonisz do tego zalogowanego użytkownika, jeśli sesja zostanie ograniczona do użytkownika (zalogujesz się z przeglądarką), a ty nazywasz to na AnonymousUser} W przypadku, gdy przeglądarka nie zalogowała się użytkownika / przeglądarka wylogowa.

1
Willem Van Onsem 18 październik 2020, 13:50