Django的self.client.login(…)在单元测试中不起作用

2024-04-25 23:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我以两种方式为单元测试创建了用户:

1)为“auth.user”创建一个fixture,大致如下:

    { 
        "pk": 1, 
        "model": "auth.user", 
        "fields": { 
            "username": "homer", 
            "is_active": 1, 
            "password": 
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2", 
            ... 
        } 
    }

我忽略了那些看似不重要的部分。

2)在设置功能中使用“创建用户”(尽管我宁愿保留 我的固定装置课程中的所有内容):

def setUp(self): 
       User.objects.create_user('homer', 'ho...@simpson.net', 'simpson') 

注意,在这两种情况下,密码都是辛普森。

我已经一次又一次地验证了这个信息被正确地加载到测试数据库中。我可以使用User.objects.get获取用户对象。我可以使用“check_password”验证密码是否正确。用户处于活动状态。

然而,self.client.login(username='homer',password='simpson')总是失败。我不明白为什么。我想我已经读过每一个与此相关的网络讨论。有人能帮忙吗?

我的单元测试中的登录代码如下所示:

    login = self.client.login(username='homer', password='simpson') 
    self.assertTrue(login) 

谢谢。


Tags: 用户selfclientauth密码objects方式username
3条回答

你能查一下吗

from django.test import TransactionTestCase, Client

class UserHistoryTest(TransactionTestCase):
    self.user = User.objects.create(username='admin', password='pass@123', email='admin@admin.com')
    self.client = Client() # May be you have missed this line

    def test_history(self):
        self.client.login(username=self.user.username, password='pass@123')
        # get_history function having login_required decorator
        response = self.client.post(reverse('get_history'), {'user_id': self.user.id})
        self.assertEqual(response.status_code, 200)

这个测试用例对我有用。

不起作用的代码:

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

user = User.objects.create(username='testuser', password='12345')

c = Client()
logged_in = c.login(username='testuser', password='12345')

为什么不起作用?

在上面的代码片段中,当创建User时,实际的密码散列设置为12345。当客户机调用login方法时,password参数的值12345通过hash函数传递,结果如下

hash('12345') = 'adkfh5lkad438....'

然后将其与存储在数据库中的散列进行比较,并拒绝客户端访问,因为'adkfh5lkad438....' != '12345'

解决方案

正确的做法是调用set_password函数,该函数通过哈希函数传递给定的字符串,并将结果存储在User.password中。

此外,在调用set_password之后,我们必须将更新的User对象保存到数据库:

user = User.objects.create(username='testuser')
user.set_password('12345')
user.save()

c = Client()
logged_in = c.login(username='testuser', password='12345')

一个更简单的方法是使用^{},Django 1.9中的新功能。

force_login(user, backend=None)

例如:

class LoginView(TestCase):
    def setUp(self):
        self.client.force_login(User.objects.get_or_create(username='testuser')[0])

相关问题 更多 >