我这里有一个奇怪的问题......
我正在尝试测试@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
答案 0 :(得分:1)
首先,无需使用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 :(得分:0)
简短版本:“也许是您的固定装置。”
长版...
我升级到1.11后遇到了这个问题。我花了一点时间来弄清楚,但是在升级版本时,Django会升级后端密码哈希器用于测试密码的迭代次数。
其结果是,在您的测试中,您的夹具可能带有以下线条:
"password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
在测试中,您可能会遇到类似这样的情况:
self.client.login(username='pandora', password='password')
事实证明,当您颠覆Django版本并获得这些额外的哈希值时,旧的固定装置将不再起作用,因为新的Django哈希测试代码提供的密码的次数比固定装置中的值要多。
>解决方案:
或者,这是可以在固定装置中使用的哈希值,用于密码“ password”:
"password": "pbkdf2_sha256$36000$OIQCpvIXZil8$y7qUtb3Y0imzu1ATn4vQZeVtu7MuPg0zUqX5oBUL2zM=",
好玩的东西。对不起,不好玩。哑巴。