Джанго Юнитест 302 ответ

Я пытаюсь сделать модульный тест для моего приложения django. Всякий раз, когда я пытаюсь получить запрос на определенную страницу, он перенаправляет меня на страницу входа. Я вошел в веб-приложение один раз в настройках, как показано ниже. Я ссылался на многие вопросы, такие как 22208821, но не могу заставить его работать. Ниже мой код.

from django.test import TestCase,Client
from django.contrib.auth.models import User
import unittest
class SimpleTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.username='testuser'
        self.email = 'test@test.com'
        self.password='12345'
        self.user =     User.objects.create_user(username=self.username,email=self.email,password=self.password)
        login = self.client.login(username=self.username,password=self.password)
        self.assertEqual(login,True)

def test_details(self):
    response = self.client.get('/dashboard/')
    print(response["location"])
    self.assertEqual(response.status_code, 200)

Выход я получаю

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
/admin/login/?next=/dashboard/
F
======================================================================
FAIL: test_details (interview.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "path", line 22, in     test_details
self.assertEqual(response.status_code, 200)
AssertionError: 302 != 200

----------------------------------------------------------------------
Ran 1 test in 0.181s

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Похоже, проблема была в том, что мой взгляд требовал статуса персонала, и я создал с помощью create_user (по умолчанию пользователь не является сотрудником). Вместо этого я использовал create_superuser, и он работал нормально. Большое спасибо.

1 ответ

Вам нужно использовать set_password исправить сохраненный хешированный пароль в тестовой БД:

def setUp(self):
        self.client = Client()
        self.username='testuser'
        self.email = 'test@test.com'
        self.password='12345'
        self.user = User(username=self.username,email=self.email)
        self.user.set_password(self.password)
        self.user.save() 
        login = self.client.login(username=self.username,password=self.password)
        self.assertEqual(login,True)

Без этого вы сохранили простой пароль к password поле. Но client.login хеширование пароля перед проверкой учетных данных, и поэтому пароль не совпадает.

Из документов:

Помните, что если вы хотите, чтобы ваш тестовый пользователь имел пароль, вы не можете установить пароль пользователя, установив атрибут пароля напрямую - вы должны использовать функцию set_password() для хранения правильно хешированного пароля.

Другие вопросы по тегам