Django 测试:User.authenticate 失败

Dan*_*ong 3 django selenium django-authentication django-tests

我已经被这个问题困扰了几个小时。我是 django 和自动化测试的新手,我一直在使用 Selenium 和 django 的 StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用 runserver 并自己测试它时,它工作得很好。)

一切工作都很好,除了我似乎无法成功登录我的测试用户。我已将断点范围缩小到 django 的 User.authenticate 方法。

User 对象在我的设置中已成功创建,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败。

我查看了以下内容以寻求帮助,但他们并没有让我走得太远:

知道为什么身份验证失败吗?我需要在设置中添加一些内容吗?

from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User

from django.contrib.auth import authenticate


class AccountTestCase(StaticLiveServerTestCase):
    def setUp(self):
        self.selenium = webdriver.Chrome()
        super().setUp()
        User.objects.create(username='test', email='test@test.com', password='Test1234', is_active=True)

    def tearDownClass(self):
        self.selenium.quit()
        super().tearDown()

    def test_register(self):
        user = authenticate(username='test', password='Test1234')
        if user is not None: # prints Backend login failed
            print("Backend login successful")
        else:
            print("Backend login failed")

    user = User.objects.get(username='test')
    print(user)
    print(user.username) # prints test
    print(user.password) # prints Test1234
Run Code Online (Sandbox Code Playgroud)

Dan*_*ong 6

我发现了这个问题。User.authenticate() 方法对提供的密码进行哈希处理。但是,我在创建用户时直接设置了密码,这意味着它存储为 Test1234,因此身份验证期间提供的哈希密码与“Test1234”不匹配,因此失败。

要正确存储哈希密码,您需要使用 set_password() 方法。

更新的设置代码:

def setUp(self):
    self.selenium = webdriver.Chrome()
    super().setUp()
    user = User.objects.create(username='test', email='test@test.com', is_active=True)
    user.set_password('Test1234')
    user.save()
Run Code Online (Sandbox Code Playgroud)