Django测试:SESSION_KEY失败断言

时间:2014-04-17 05:23:27

标签: python django django-views django-testing

我正在使用Django Test客户端(django.test.Client)来运行视图测试。在我的索引函数上尝试使用Test Client来处理登录请求时,即使验证成功发生,它也会不断测试。

继承我的考试:

def test_login(self):
   response = self.client.post('/login/', {'username':'user', 'password':'pass'})

   print response.content

   self.assertIn(SESSION_KEY, self.client.session) 

因此我知道登录过程成功的原因是因为response.content从另一个视图中生成HTML数据,只有在request.user.is_authenticated()为true时才能访问该视图。换句话说,他们必须登录response.content以产生"登录页面"。所以考虑到这一点,我可以说这个函数显然是为了记录用户的实际目的而工作,但是,我一直在搜索文档数小时试图弄清楚为什么我无法访问SESSION_KEY客户会话。我的所有阅读都表明,django测试客户端实际上是有状态的并且应该存储会话。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

好好经过多次搜索并询问#django,我为Django 1.6.x做了一个有效的解决方案

from django.contrib.auth import SESSION_KEY, get_user_model
from django.test import Client

def setUp(self):
    self.client = Client()

def test_login_view(self):

    user_pk = get_user_model()._default_manager.get(username__exact='test_username_here').pk

    response = self.client.post('/login/', {'username':'test_username_here', 'password':'test_password_here'})

    self.assertEqual(self.client.session[SESSION_KEY], user_pk)

test_login_view函数将评估我的应用程序中的视图,该视图处理来自模板表单的用户登录。首先,我抓住user_pk,这是数据库中给定用户的真正主键。我使用get_user_model()而不是User.objects.get(),因为前者允许您引用,无论用户模型是否被修改。当然你也可以使用后者。其次,我继续使用测试客户端发送帖子请求,就像标准用户的浏览器一样。最后,我发现self.client.session [SESSION_KEY]包含登录用户的主键。 (如果登录成功,否则,它只会产生KeyError)