python - Django 测试框架中的 login()

标签 python django testing authentication

我已经开始使用 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/

相关文章:

python - 安装 SOAPpy 模块的困难

jquery - Django 休息框架 : Upload file via AJAX

django - 除了 super 用户,如何使字段在 django admin 中只读?

testing - 是否可以在不使用 NPM 的情况下使用自定义 TestCafé 浏览器提供程序?

c# - 在单元测试中生成线程

python - 从 html 表单中获取整数

python - If equal 在 Django 模板中不起作用

python - 使用 `pip` 部署自定义 python 包

mysql - select_for_update 在解锁后是否会看到另一个 select_for_update 事务添加的行?

安卓 Kotlin 测试。 lateinit 属性 _db 尚未初始化