Django test.Client已登录,但在视图中以AnonymousUser身份传递

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

我这里有一个奇怪的问题......

我正在尝试测试@login_required视图,所以我编写了这段代码:

from django.test import TestCase
from django.test import Client
from .models import SiteEcommerce
from .models import Client as TestDbClient
from .models import MyCustomEmailUser


class DataBaseTestCase(TestCase):
    def __init__(self, *args, **kwargs):
        super(DataBaseTestCase, self).__init__(*args, **kwargs)
        self.c = Client()  # instantiate the Django test client
        self.user = MyCustomEmailUser.objects.all()[0]

    def test_method(self):
        """
        Test of the settings page.
        """
        self.c.login(username=self.user.email, password=self.user.password)
        print self.user.is_authenticated()
        response = self.client.get('/main/settings/%s' % self.website.idsite)
        self.assertEqual(response.status_code, 200)

这个视图叫做settings_view我在哪里打印request.user

问题是在测试中print self.user.is_authenticated()True但是request.user在视图中返回AnonymousUser

python django unit-testing django-testing
2个回答
1
投票

首先,没有必要使用self.c = Client()创建一个新的客户端 - 只需使用self.client。您不应该使用__init__方法访问数据库。相反,您应该在setUpsetupTestData方法中设置用户。

def setUp(self, *args, **kwargs):
    self.user = MyCustomEmailUser.objects.all()[0]

如果要检查客户端登录是否有效,则应检查self.client.login(...)的值。没有必要检查self.user.is_authenticated(),因为它将永远返回True

您的登录不起作用,因为self.user.password是哈希密码,而不是实际密码。

你可以用force_login代替。

self.client.force_login(self.user)

0
投票

简短版:“这可能是你的装置。”


长版......

升级到1.11后我遇到了这个问题。我花了一分钟才弄明白,但是当你升级版本时,Django会升级后端密码用于测试密码的迭代次数。

结果是,在你的测试中你可能有一个像以下一样的夹具:

"password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",

在您的测试中,您可能会遇到以下情况:

self.client.login(username='pandora', password='password')

事实证明,当你碰到你的Django版本并得到那些额外的哈希时,那个旧的灯具不再有效,因为新的Django哈希测试代码提供的密码比你在灯具中的值多了几倍。

解决方案:

  1. 在您的开发机器上,使用您想要的夹具创建一个用户。
  2. 找到该用户的管理页面。
  3. 将该用户复制到其失败的夹具中。

或者,这是一个散列值,您可以在适用于密码“password”的灯具中使用:

"password": "pbkdf2_sha256$36000$OIQCpvIXZil8$y7qUtb3Y0imzu1ATn4vQZeVtu7MuPg0zUqX5oBUL2zM=",

好玩的东西。对不起,不好玩。哑。

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