我已经开始使用 Django 的测试框架,一切都工作正常,直到我开始测试经过身份验证的页面。
为了简单起见,我们假设这是一个测试:
class SimpleTest(TestCase):
def setUp(self):
user = User.objects.create_user('temporary', '[email protected] /cdn-cgi/l/email-protection', 'temporary')
def test_secure_page(self):
c = Client()
print c.login(username='temporary', password='temporary')
response = c.get('/users/secure/', follow=True)
user = User.objects.get(username='temporary')
self.assertEqual(response.context['email'], '[email protected] /cdn-cgi/l/email-protection')
运行此测试后,它失败了,并且我看到打印了 login() 的返回值True, but 响应内容被重定向到登录页面(如果登录失败,身份验证装饰器将重定向到登录页面)。我在进行身份验证的装饰器中放置了一个断点:
def authenticate(user):
if user.is_authenticated():
return True
return False
它真的回来了False。 test_secure_page() 中的第 4 行正确检索用户。
这是视图函数:
@user_passes_test(authenticate, login_url='/users/login')
def secure(request):
user = request.user
return render_to_response('secure.html', {'email': user.email})
当然,如果我尝试通过应用程序登录(测试之外),一切正常。