有关如何使用TDD测试DRF模型权限的建议

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

我正在为教育网站编写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个回答
0
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.