我正在使用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测试客户端实际上是有状态的并且应该存储会话。
有人可以对此有所了解吗?
答案 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)