在测试Django时访问request.user对象

问题描述 投票:4回答:2

我正在尝试使用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期间设置所有必要的信息来解决这个问题,但在我这样做之前,我想检查一下我是否只是错过了一些东西。

django testing client request
2个回答
2
投票

使用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 )

0
投票

这似乎是一种迂回的方式,但它可能是有用的。

使用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()

我希望这很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.