我有这个测试用例
def setUp(self):
self.user = User.objects.create(username="tauri", password='gaul')
def test_loginin_student_control_panel(self):
c = Client()
c.login(username="tauri", password="gaul")
response = c.get('/student/')
self.assertEqual(response.status_code, 200)
与测试用例相关联的视图是
@login_required
def student(request):
return render_to_response('student/controlpanel.html')
所以我的问题是上面的测试用例将用户重定向到登录的原因 页? c.login不应该注意认证用户吗?
答案 0 :(得分:4)
问题在于您创建User对象的方式。
Django不会将您的密码以纯文本形式存储在数据库中,而是存储其哈希值。但是在您的代码中,密码是以纯文本格式设置的。
因此,当您在内部使用c.login(...)
时,Django将调用check_password
方法,该方法将根据您传递的密码生成哈希值,并将其与存储在数据库中的密码进行比较,并将其作为结果将返回False
,因为来自DB的'gaul'不等于get_hexdigest('gaul')
有两种选择:
1)使用User.objects.create_user
方法来处理密码哈希:
def setUp(self):
self.user = User.objects.create_user(username='tauri',
password='gaul',
email='')
2)或使用set_password
方法设置密码:
def setUp(self):
self.user = user = User.objects.create(username='tauri')
user.set_password('gaul')
user.save()
答案 1 :(得分:1)
您确定在setUp功能中创建了用户条目吗?
User.objects.create_user(username="tauri", password="gual")