Django 测试客户端将登录用户重定向到登录页面

问题描述 投票:0回答:1

我知道这个问题已经被问过,但没有一个答案对我有用。

每当我尝试在 Django 测试中使用客户端登录时,它基本上都会被忽略,并且我会重定向到登录页面。经过几次测试后,我注意到它可以正确登录我,但在我使用它时将我踢出。

这是我的代码的精简版本,仍然可以重现这一点。

from django.auth import get_user

class MapListViewTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        # Create a user
        cls.user = get_user_model().objects.create(username="testuser")
        cls.user.set_password("password")
        cls.user.save()

        # [...]

    def setUp(self):
        self.client.login(
            username=self.user.get_username(), password=self.user.password
        )

    def test_map_list_view_renders(self):
        """Test that the MapListView renders successfully and includes a list of maps."""
        logger.info(get_user(self.client)) # <-- <django.contrib.auth.models.AnonymousUser object at 0x7377d5589540>
        
        self.client.login(
            username=self.user.get_username(), password=self.user.password
        )
        logger.info(get_user(self.client)) # <-- <Profile: testuser>

        response = self.client.get(reverse("map_list"), follow=True)
        logger.info(get_user(self.client)) # <-- <django.contrib.auth.models.AnonymousUser object at 0x7377d5589540>

        self.assertEqual(response.status_code, 200) # <-- OK
        self.assertTemplateUsed(response, "map_list.html") # <-- lands on 'account/login.html'

(我在代码片段中放了两次,但它只在真实代码的setUp中)

我不知道这是否有任何相关性,但是重定向将地址从

http://localhost/...
更改为
http://testserver/...
,并且我正在docker容器中工作。

此外,用户模型继承自AbstractUser,并且没有自定义登录逻辑。

django django-testing
1个回答
0
投票

self.client.login

self.client.login(
        username=self.user.get_username(), password=self.user.password
    )

这里

self.user.password
不起作用,因为它是哈希密码,而该方法需要纯文本密码。

试试这些

self.client.login(username=self.user.get_username(), password="password")

我们将

self.user.password
替换为
"password"
,以获得明文形式的密码。

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