在书面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与特定用户对象相同的假设。我猜它没关系,但看起来有点笨拙。
无论如何都要避免这种假设?
答案 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)