我已经开始使用 Django 的测试框架,一切正常,直到我开始测试经过身份验证的页面。
为了简单起见,假设这是一个测试:
class SimpleTest(TestCase):
def setUp(self):
user = User.objects.create_user('temporary', 'temporary@gmail.com', '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'], 'temporary@gmail.com')
运行此测试后,它失败了,我看到 login() 的打印返回值返回 True,但 response.content 被重定向到登录页面 (如果登录失败,身份验证装饰器将重定向到登录页面)。我在进行身份验证的装饰器中设置了一个断点:
def authenticate(user):
if user.is_authenticated():
return True
return False
它确实返回 False。 test_secure_page() 中的第 4 行正确检索用户。
这是 View 函数:
@user_passes_test(authenticate, login_url='/users/login')
def secure(request):
user = request.user
return render_to_response('secure.html', {'email': user.email})
当然,如果我尝试通过应用程序(测试之外)登录,一切正常。
最佳答案
问题是您没有将 RequestContext
传递给您的模板。
另外,您可能应该使用 login_required
装饰器和内置在 TestCase
类中的客户端。
我会这样重写它:
#views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.contrib.auth import get_user_model
@login_required(login_url='/users/login')
def secure(request):
user = request.user
return render(request, 'secure.html', {'email': user.email})
#tests.py
class SimpleTest(TestCase):
def setUp(self):
User = get_user_model()
user = User.objects.create_user('temporary', 'temporary@gmail.com', 'temporary')
def test_secure_page(self):
User = get_user_model()
self.client.login(username='temporary', password='temporary')
response = self.client.get('/manufacturers/', follow=True)
user = User.objects.get(username='temporary')
self.assertEqual(response.context['email'], 'temporary@gmail.com')
关于python - Django 测试框架中的 login(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367509/