我这里有一个奇怪的问题......
我正在尝试测试@login_required视图,所以我编写了这段代码:
from django.test import TestCase
from django.test import Client
from .models import SiteEcommerce
from .models import Client as TestDbClient
from .models import MyCustomEmailUser
class DataBaseTestCase(TestCase):
def __init__(self, *args, **kwargs):
super(DataBaseTestCase, self).__init__(*args, **kwargs)
self.c = Client() # instantiate the Django test client
self.user = MyCustomEmailUser.objects.all()[0]
def test_method(self):
"""
Test of the settings page.
"""
self.c.login(username=self.user.email, password=self.user.password)
print self.user.is_authenticated()
response = self.client.get('/main/settings/%s' % self.website.idsite)
self.assertEqual(response.status_code, 200)
这个视图叫做settings_view
我在哪里打印request.user
问题是在测试中print self.user.is_authenticated()
给True
但是request.user
在视图中返回AnonymousUser
首先,没有必要使用self.c = Client()
创建一个新的客户端 - 只需使用self.client
。您不应该使用__init__
方法访问数据库。相反,您应该在setUp
或setupTestData
方法中设置用户。
def setUp(self, *args, **kwargs):
self.user = MyCustomEmailUser.objects.all()[0]
如果要检查客户端登录是否有效,则应检查self.client.login(...)
的值。没有必要检查self.user.is_authenticated()
,因为它将永远返回True
。
您的登录不起作用,因为self.user.password
是哈希密码,而不是实际密码。
你可以用force_login
代替。
self.client.force_login(self.user)
简短版:“这可能是你的装置。”
长版......
升级到1.11后我遇到了这个问题。我花了一分钟才弄明白,但是当你升级版本时,Django会升级后端密码用于测试密码的迭代次数。
结果是,在你的测试中你可能有一个像以下一样的夹具:
"password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
在您的测试中,您可能会遇到以下情况:
self.client.login(username='pandora', password='password')
事实证明,当你碰到你的Django版本并得到那些额外的哈希时,那个旧的灯具不再有效,因为新的Django哈希测试代码提供的密码比你在灯具中的值多了几倍。
解决方案:
或者,这是一个散列值,您可以在适用于密码“password”的灯具中使用:
"password": "pbkdf2_sha256$36000$OIQCpvIXZil8$y7qUtb3Y0imzu1ATn4vQZeVtu7MuPg0zUqX5oBUL2zM=",
好玩的东西。对不起,不好玩。哑。