【问题标题】:Advice on how to test DRF model permissions with TDD关于如何使用 TDD 测试 DRF 模型权限的建议
【发布时间】:2019-03-26 05:33:04
【问题描述】:

我正在为一个教育网站编写一个 DRF API,用户可以根据他们拥有的权限组和对象级别权限访问数据。当我开始编写测试时,我想知道是否有必要使用所有可能的权限组合来测试请求。例如,假设 API 的一个端点需要三个权限才能访问其数据,那么您可以编写大量测试方法来测试用户可能拥有的所有可能的权限组合。只有一种组合,即用户拥有所有三种权限的组合,会产生数据,其余的很可能会产生 403 禁止响应。

例如,这三个权限可能是 IsAuthenticated、IsOwner 和 IsTeacher。用户需要拥有所有三个权限,因此 403 Forbidden Response 组合将是:

IsOwner    IsAuthenticated    IsTeacher
False      False              False,
False      False              True,
False      True               True,
True       False              False,
True       True               False,
True       False              True,
False      True               False,

允许用户访问数据的有效响应是:

IsOwner    IsAuthenticated    IsTeacher
True       True               True

是否需要全部测试?我应该用其他方式测试它吗?

【问题讨论】:

    标签: django django-rest-framework tdd django-testing django-permissions


    【解决方案1】:

    您不需要测试所有组合,但如果您觉得应该做这么多,最好覆盖所有测试用例。你可以在这样的一个测试用例中做到这一点。 如果您想测试所有组合,您可以在此处更改权限顺序并编写新案例。

    from rest_framework import status
    from django.contrib.auth.models import Permission,User
    
    class MyTest(APITestCase):
        client = APIClient()
        url = "/my/url/"
    
        def setUp(self):
                self.user = User.objects.create(username="hellouser")
    
        def test_user_permissions(self):
                res = self.client.post(self.url, data={"some": "data"}, format="json")
                self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
                #now give permission
                permission = Permission.objects.get(name='isOwner')
                self.user.user_permissions.add(permission) 
                res = self.client.post(self.url, data={"some": "data"}, format="json")
                self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
                #give another
                permission = Permission.objects.get(name='isTeacher')
                self.user.user_permissions.add(permission) 
                res = self.client.post(self.url, data={"some": "data"}, format="json")
    
                self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
                #last one should pass
                permission = Permission.objects.get(name='isAuthenticated')
                self.user.user_permissions.add(permission) 
                res = self.client.post(self.url, data={"some": "data"}, format="json")
    
                self.assertEqual(res.status_code, status.HTTP_200_OK)
    

    【讨论】:

    • 谢谢,我知道你可以避免一些组合。我想知道你是否应该对它进行如此严格的测试,我现在看到的是我想测试它有多彻底。感谢您的帮助和清晰的示例!
    • self.user 在这些请求中什至在哪里使用?我不知道 self.client 将如何知道用户是谁。
    • @Mark def setUp(self): self.user = User.objects.create(username="hellouser") 在运行测试时首先运行它被分配在那里。
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多