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

时间:2017-05-24 20:31:37

标签: python django unit-testing django-testing

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

我正在尝试测试@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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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=",

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