测试 Django 管理操作(重定向/身份验证问题)

Posted

技术标签:

【中文标题】测试 Django 管理操作(重定向/身份验证问题)【英文标题】:Testing Django Admin Action (redirecting/auth issue) 【发布时间】:2017-06-29 02:21:59 【问题描述】:

我正在尝试为 change_list 视图中的管理员操作编写测试。我提到了this question,但无法进行测试。这是我的代码和问题:

class StatusChangeTestCase(TestCase):
"""
Test case for batch changing 'status' to 'Show' or 'Hide'
"""

    def setUp(self):
        self.categories = factories.CategoryFactory.create_batch(5)

    def test_status_hide(self):
        """
        Test changing all Category instances to 'Hide'
        """
        # Set Queryset to be hidden
        to_be_hidden = models.Category.objects.values_list('pk', flat=True)
        # Set POST data to be passed to changelist url
        data = 
            'action': 'change_to_hide',
            '_selected_action': to_be_hidden
            
        # Set change_url
        change_url = self.reverse('admin:product_category_changelist')
        # POST data to change_url
        response = self.post(change_url, data, follow=True)
        self.assertEqual(
            models.Category.objects.filter(status='show').count(), 0
           )

    def tearDown(self):
        models.Category.objects.all().delete()

我尝试使用print 来查看响应是什么,这就是我得到的:

<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/admin/login/?next=/admin/product/category/">

它似乎需要我的登录凭据 - 我尝试在 setUp() 中创建一个用户并按照 Django docs on testing 登录,但它似乎不起作用。

任何帮助将不胜感激!

【问题讨论】:

是的,你需要创建一个用户,然后登录测试客户端。请说明您尝试了什么以及发生了什么。 @Alasdair 谢谢!我重新尝试了它(在睡了一会儿之后)并意识到我没有实例化 django 的 Client 类,因此登录并没有在我的后续请求中持续存在。感谢您指出我正确的方向:) 【参考方案1】:

我找到了解决方案 - 当我创建超级用户时,我没有实例化 Django 的 Client() 类,所以每当我登录时 - 它并没有持续存在于我的后续请求中。正确的代码应该是这样的。

def test_status_hide(self):

    """
    Test changing all Category instances to 'Hide'
    """

    # Create user
    user = User.objects.create_superuser(
        username='new_user', email='test@example.com', password='password',
    )

    # Log in
    self.client = Client()
    self.client.login(username='new_user', password='password')

    # Set Queryset to be hidden
    to_be_hidden = models.Category.objects.values_list('pk', flat=True)

    # Set POST data to be passed to changelist url
    data = 
        'action': 'change_to_hide',
        '_selected_action': to_be_hidden
        

    # Set change_url
    change_url = self.reverse('admin:product_category_changelist')

    # POST data to change_url
    response = self.client.post(change_url, data, follow=True)
    self.assertEqual(
        models.Category.objects.filter(status='show').count(), 0
        )

【讨论】:

如果你使用 Django 的测试用例类 (from django.test import TestCase) 那么你可以使用self.client 而无需自己实例化。

以上是关于测试 Django 管理操作(重定向/身份验证问题)的主要内容,如果未能解决你的问题,请参考以下文章

无需重定向的 Django 远程身份验证

Laravel - 具有多重身份验证的未经身份验证的重定向问题

Django用户身份验证:登录后不重定向

Django 身份验证 - 错误的重定向 url 到登录页面

我该如何处理 Django 中的 spotify api 身份验证重定向 uri?

Django:测试页面是不是已重定向到所需的 url