django - 让用户登录测试客户端

时间:2012-02-17 17:10:17

标签: django testing

在书面django测试中,如何获取当前登录用户?

例如,这是我想写的测试:

def test_author_set_once(self):
    self.client.login(username='Adam', password='password')
    #create an object and test the author is adam
    self.client.login(username='Barry', password='password')
    #modify the first object and test that the author has not changed

所以我希望能够说出类似......

self.assertEqual(object.author, self.client.user)

(但我不能)

此刻我编码的方式是这样的:

self.client.login(username='Adam', password='password')
self.user = User.objects.get(username='Adam')
#create an object 
self.assertEqual(object.author, self.user)

这依赖于request.user与特定用户对象相同的假设。我猜它没关系,但看起来有点笨拙。

无论如何都要避免这种假设?

4 个答案:

答案 0 :(得分:29)

实际上,您无法通过测试客户端响应访问当前用户。

但是,您可以检查某些用户是否已登录。检查self.client.session即可:

self.client.session['_auth_user_id']
>>> 1

这有一个more detailed answer

答案 1 :(得分:28)

测试客户端与请求无关。它本身并不包含有关用户登录信息的信息。(由于显而易见的原因,您的实际网络服务器或Django开发服务器也是如此,并且这些原因同样适用于此处。)

login只是测试客户端上的一种便捷方法,它基本上使用已定义的用户凭据模仿POST到/login/。没什么。

request上的实际用户就像在视图中一样。但是,由于您无法直接访问视图,因此Django会在视图的响应中使request可用。实际使用测试客户端加载视图后,您可以存储结果,然后通过以下方式获取用户:

response.request.user

更新版本的Django将使用:

response.context["user"]

答案 2 :(得分:6)

我不知道您使用的是哪个版本。从1.10.2开始,wsgi_request中有一个response属性,它在您的视图中用作request对象。

因此,登录用户非常简单:

response.wsgi_request.user

答案 3 :(得分:1)

你可以log in with a test user这样:

from django.contrib.auth.models import User
user = User.objects.create_user('foo', 'myemail@test.com', 'bar')
self.client.login(username='foo', password='bar')

现在,您可以在测试中使用user

self.assertEqual(created_model_object.user, user)

相关问题