Тест на вход, регистрацию и выход не прошел AssertionError: 200 != 302 django

Я пытаюсь создать тест для моих представлений входа, выхода и регистрации, но я продолжаю получать эту ошибку AssertionError: 200 != 302. Вот коды:

МОДЕЛЬ Вот модель пользователя

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    full_name = models.CharField(max_length=300, null=True, blank=True)
    username = models.CharField(max_length=150)
    email = models.EmailField(unique=True)
    avatar = models.ImageField(upload_to='user-profile-images/', null=True)

    USERNAME_FIELD = 'email'
    
    REQUIRED_FIELDS = ['username']

ПРОСМОТРОВ Вот вид функции входа и регистрации

def loginPage(request):
    context = {}
    if request.user.is_authenticated:
        return redirect('home')

    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')

        try:
            user = User.objects.get(email=email)
        except:
            messages.error(request, 'User does not exist')

        user = authenticate(request, email=email, password=password)

        if user is not None:
            login(request, user)
            return redirect('home')
             
    return render(request,'registration/login.html', context)

def registerPage(request):
    form = SignupForm
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.username = user.username.lower()
            user.save()
            login(request, user)
            return redirect ('home')
        else:
            messages.error(request, 'An error occured during registration')

    return render(request, 'registration/register.html', {'form':form})

def logoutPage(request):
    logout(request)
    return redirect('home')

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.loginPage, name='login'),
    path('logout/', views.logoutPage, name='logout'),
    path('register/', views.registerPage, name='register'),

]

ТЕСТ

from django.test import TestCase, Client
from django.urls import reverse
from mydp_app.models import User

class TestViews(TestCase):

    def setUp(self):
        self.client = Client()
        self.login_url = reverse('login')
        self.logout_url = reverse('logout')
        self.register_url = reverse('register')

   def test_register_post(self):
        response = self.client.post(reverse('register'), {
            'full_name': 'Test User',
            'username': 'testuser',
            'email': 'testuser@gmail.com',
            'password': 'testpassword',
            'password2': 'testpassword',
        })
        self.assertEquals(response.status_code, 302)

    def test_login_post(self):
        response = self.client.post(reverse('login'), {
            'email': 'testuser@gmail.com',
            'password': 'testpassword',
        })
        self.assertEquals(response.status_code, 302)

    def test_logout(self):
        self.client.login(email='testuser@gmail.com', password='testpassword')
        response = self.client.post(reverse('logout'), follow=True)
        self.assertEquals(response.status_code, 302)

Тест ожидает, что код состояния будет 200, но он должен быть перенаправлен. Я продолжаю получать эту ошибку self.assertEquals(response.status_code, 302) AssertionError: 200 != 302

Если вы хотите проверить, что пользователь был успешно перенаправлен (код ответа 302), то вы можете удалить follow=True:

    def test_logged_out_user_was_redirected(self):
        self.client.login(email='testuser@gmail.com', password='testpassword')
        response = self.client.post(reverse('logout'))
        self.assertEquals(response.status_code, 302)

Если вы хотите убедиться, что они были перенаправлены в нужное место, вы можете установить follow=True, установить код на 200 и использовать assertTemplateUsed:

    def test_logout_redirect_succeeds(self):
        self.client.login(email='testuser@gmail.com', password='testpassword')
        response = self.client.post(reverse('logout'), follow=True)
        self.assertEquals(response.status_code, 200)
        self.assertTemplateUsed(self.response, 'my_app/redirect_page.html')`

Когда у вас follow=True код ответа будет 200 в случае успеха, а не 302.

Я задавал этот вопрос давно и узнал, что follow=True в pytest это невозможно. В процессе я узнал немного об использовании флага follow=True.

Я предполагаю, что единственный тест, который сейчас не работает, это test_logout. Ваш код для этого таков:

        response = self.client.post(reverse('logout'), follow=True)
        self.assertEquals(response.status_code, 302)

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или необходимость в разъяснении, и я могу очистить это. Если я ошибаюсь, дайте мне знать.

Вернуться на верх