在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与特定用户对象相同的假设。我想它还可以,但它看起来有点笨拙。
有什么办法可以避免这种假设吗?
发布于 2012-02-18 01:34:11
测试客户端是请求不可知的。它本身并不保存有关登录用户的信息。(由于显而易见的原因,您的实际dev服务器或Django开发服务器也不是这样的,同样的原因也适用于这里)。
login
只是测试客户机上的一种方便的方法,它本质上是用定义的用户凭据模拟到/login/
的POST。没别的了。
实际用户可以在request
上使用,就像在视图中一样。但是,因为您不能直接访问视图,所以Django在视图的响应中提供了request
。在您实际使用测试客户端加载视图之后,您可以存储结果,然后通过以下方式获取用户:
response.request.user
更新版本的Django将使用:
response.wsgi_request.user
发布于 2012-11-02 04:18:59
实际上,您不能通过测试客户端响应访问当前用户。
但是,您可以检查是否有用户已登录。检查self.client.session
将完成以下工作:
self.client.session['_auth_user_id']
>>> 1
有一个用于此的more detailed answer。
发布于 2017-04-07 15:00:17
我不知道您使用的是哪个版本。从1.10.2开始,response
中有一个wsgi_request
属性,它在您的视图中作为request
对象。
因此,让用户登录非常简单:
response.wsgi_request.user
https://stackoverflow.com/questions/9332541
复制相似问题