【问题标题】:How to test admin change views?如何测试管理员更改视图?
【发布时间】:2020-06-04 22:48:48
【问题描述】:

我的 Django 模型有一个相当复杂的管理更改视图。

有很多关于如何测试管理列表视图的资源(例如here),但不是用于更改视图。

如何为它创建测试用例?

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

    您可以使用 Django 的test client 测试任何模型的管理员更改视图。

    为此,您需要模型的特定视图 URL,可以按照docs 中的说明生成。

    以下是如何为 Group 模型运行简单的“正常加载”测试的示例:

    from django.contrib.auth.models import User, Group
    from django.test import TestCase, Client
    from django.urls import reverse
    
    
    def get_admin_change_view_url(obj: object) -> str:
        return reverse(
            'admin:{}_{}_change'.format(
                obj._meta.app_label,
                type(obj).__name__.lower()
            ),
            args=(obj.pk,)
        )
    
    
    class TestGroupAdmin(TestCase):
    
        def test_change_view_loads_normally(self):
            # prepare client
            User.objects.create_superuser(
                username='superuser', password='secret', email='admin@example.com'
            )
            c = Client()
            c.login(username='superuser', password='secret')                
    
            # create test data
            my_group = Group.objects.create(name='Test Group')
    
            # run test
            response = c.get(get_admin_change_view_url(my_group))
            self.assertEqual(response.status_code, 200)
    
    

    【讨论】:

      【解决方案2】:

      根据 Erik 的回答,这是一个对其他模型更灵活的版本。

      from django.contrib.auth.models import User, Group
      from django.test import TestCase, Client
      from django.urls import reverse
      
      
      def get_admin_change_view_url(obj: object) -> str:
          return reverse(
              'admin:{}_{}_change'.format(
                  obj._meta.app_label,
                  type(obj).__name__.lower()
              ),
              args=(obj.pk,)
          )
      
      
      class BaseAdminTestCaseMixin:
          def setUp(self):
              self.client = Client()
              User.objects.create_superuser(
                  username='superuser', password='secret', email='admin@example.com'
              )
              c.force_login(username='superuser', password='secret')
      
          def get_instance(self):
              raises NotImplementedError()
              instance, _ = Group.objects.get_or_create(name='Test Group')
              return instance
      
          def test_change_view_loads_normally(self):
              instance = self.get_instance()
              response = c.get(get_admin_change_view_url(instance))
              self.assertEqual(response.status_code, 200)
      
      
      class TestGroupAdmin(BaseAdminTestCaseMixin, TestCase):
          def get_instance(self):
              instance, _ = Group.objects.get_or_create(name='Test Group')
              return instance
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多