django - 关于如何使用 TDD 测试 DRF 模型权限的建议
问题描述
我正在为一个教育网站编写一个 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
有必要全部测试吗?我应该以另一种方式对其进行测试吗?
解决方案
您不需要测试所有组合,但如果您觉得应该做这么多,最好覆盖所有测试用例。你可以在这样的一个测试用例中做到这一点。如果您想测试所有组合,您可以在此处更改权限顺序并编写新案例。
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)
推荐阅读
- powershell - 通过脚本设置管道变量时,Azure DevOps 是否会删除引号?
- docker - Dockerfile 客户端和服务器构建
- c# - C# 文件流在线程中变得关闭
- javascript - 仅在浏览器中更改路由路径的名称
- mysql - Mysql vs sql express server (HEX -> bigint 和 bigint -> HEX 转换)
- spring-boot - Spring boot TaskScheduler 在TaskRegistrar 调度任务时不生效
- c# - WPF Datagrid:通过 UI 编辑已使用 ValueConverter 转换的值
- javascript - 消息未定义 discord.js 聊天机器人
- sqlite - 链接表的多个外键路径
- linkedin - 某些用户的回复中缺少“emailAddress”