在书面的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)
hso*_*hso 31
实际上,您无法通过测试客户端响应访问当前用户.
但是,您可以检查某些用户是否已登录.检查self.client.session将执行:
self.client.session['_auth_user_id']
>>> 1
Run Code Online (Sandbox Code Playgroud)
有一个更详细的答案.
您可以像这样使用测试用户登录:
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)
| 归档时间: |
|
| 查看次数: |
15315 次 |
| 最近记录: |