Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 关于如何使用TDD测试DRF模型权限的建议_Django_Django Rest Framework_Tdd_Django Testing_Django Permissions - Fatal编程技术网

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

Django 关于如何使用TDD测试DRF模型权限的建议,django,django-rest-framework,tdd,django-testing,django-permissions,Django,Django Rest Framework,Tdd,Django Testing,Django Permissions,我正在为一个教育网站编写一个DRFAPI,用户可以根据他们拥有的权限组和对象级权限访问数据。当我开始编写测试时,我想知道是否有必要使用所有可能的权限组合来测试请求。例如,假设API的一个端点需要三个权限才能访问其数据,那么您可以编写许多测试方法来测试用户可能拥有的所有可能的权限组合。只有一种组合,即用户拥有所有三种权限的组合,将生成数据,其余组合最有可能生成403禁止响应 例如,这三个权限可能类似于IsAuthenticated、IsOwner和IsTech。用户需要拥有所有三个权限,因此403

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

例如,这三个权限可能类似于IsAuthenticated、IsOwner和IsTech。用户需要拥有所有三个权限,因此403个禁止响应组合为:

IsOwner是经过身份验证的IsTeacher
假假假假,,
假假假真,
假是真,
真假假假,
真假,,
真假假假真,
假,真,假,,
允许用户访问数据的有效响应为:

IsOwner是经过身份验证的IsTeacher
千真万确

是否有必要对所有这些进行测试?我应该用另一种方法测试它吗?

您不需要测试所有的组合,但是如果您觉得需要这么多,最好覆盖所有的测试用例。您可以在这样的一个测试用例中完成它。 如果您想测试所有的组合,您可以更改权限序列并在这里编写新的案例

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”)
在运行分配给它的测试时首先运行。