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

pow*_*wlo 23 testing django

在书面的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
Run Code Online (Sandbox Code Playgroud)

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

self.assertEqual(object.author, self.client.user)
Run Code Online (Sandbox Code Playgroud)

(但我不能)

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

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

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

反正有没有避免这个假设?

Chr*_*att 34

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

login只是测试客户端上的一种便捷方法,它基本上模仿了/login/使用已定义的用户凭据的POST .而已.

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

response.request.user
Run Code Online (Sandbox Code Playgroud)

更新版本的Django将使用:

response.context["user"]
Run Code Online (Sandbox Code Playgroud)

  • 好的伙计们.我添加了这个答案**2年前**.不出所料,Django从那时起显然已经改变了一点*(就像3,算上他们,3次重大修改).这不是*开始低估我的答案的理由.http://stackoverflow.com/privileges/vote-down (25认同)
  • @FábioDiniz:阅读链接.downvote是有充分理由的.这不是其中之一.答案是一个时刻的事情.如果每个人都有责任回去并编辑他们曾经给出的每一个答案,以确保它始终是最新的,那么这将是一份全职工作.我甚至不再使用Django并且没有用于最后两个版本,所以我不知道Django改变了什么以及他们没有改变什么.我们不要傻. (17认同)
  • 而且,我们不要忘记这正是为什么编辑可供*所有人*使用,即使您只需要等待您的编辑被批准.那些积极使用技术并知道某些事情发生了变化的人可以编辑答案而无需涉及原始海报. (17认同)
  • 我认为是,你应该编辑它,因为开发人员可能会错误地使用它 (11认同)
  • 我的回复在请求字典中没有用户. (3认同)

hso*_*hso 31

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

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

self.client.session['_auth_user_id']
>>> 1
Run Code Online (Sandbox Code Playgroud)

有一个更详细的答案.


Ada*_*rrh 8

您可以像这样使用测试用户登录

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

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

self.assertEqual(created_model_object.user, user)


小智 8

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

所以登录用户非常简单:

response.wsgi_request.user
Run Code Online (Sandbox Code Playgroud)