在测试Django时访问request.user对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在测试Django时访问request.user对象相关的知识,希望对你有一定的参考价值。
我正在尝试使用django的客户端类测试我的应用程序时访问request.user对象。
from django.test import TestCase
from django.test.client import Client
class SomeTestCase(TestCase):
def setUp(self):
self.client = Client()
self.client.login( username="foo", password="bar")
def test_one(self):
response = self.client.get("/my_profile/")
self.fail( response.request.user )
这显然会失败,但它失败了因为response.request没有用户属性。
AttributeError: 'dict' object has no attribute 'user'
有没有办法从客户端实例访问用户对象?我想这样做是为了检查一些测试用户的数据是否正确呈现。我可以尝试通过在setUp期间设置所有必要的信息来解决这个问题,但在我这样做之前,我想检查一下我是否只是错过了一些东西。
答案
使用response.context['user']
。
如果您使用RequestContext
,则用户在模板上下文中自动可用。请参阅auth data in templates doc。
否则我相信你应该只查询它:
def test_one(self):
response = self.client.get("/my_profile/")
user = User.objects.get(username="foo")
self.fail( user.some_field == False )
另一答案
这似乎是一种迂回的方式,但它可能是有用的。
使用RequestFactory,非常简单。它模仿请求对象。
from django.test import TestCase, RequestFactory
from django.test.client import Client
from django.contrib.auth.models import User
class SomeTestCase(TestCase):
def setUp(self):
self.client = Client()
self.factory = RequestFactory()
self.user = User.objects.create_user(
username='foo', email='foo@bar',
password='bar')
def test_one(self):
self.client.login( username="foo", password="bar")
request = self.factory.get("/my_profile/")
request.user = self.user
#rest of your code
def tearDown(self):
self.user.delete()
我希望这很有帮助。
以上是关于在测试Django时访问request.user对象的主要内容,如果未能解决你的问题,请参考以下文章
通用视图中的 request.user 和 django 中的纯函数
使用django时如何在ajax调用中传递request.user?
django 内置模块auth的login与authenticate功能简单测试
Django Rest Framework 嵌套对象使用 request.user 创建