Python 如何在Django框架中使用自定义权限对POST请求进行单元测试?
各位。我希望你做得很好。我是Django新手,试图学习RESTful开发的基础知识。我只懂Python,所以Django REST框架目前最适合我 现在我正在尝试为我的API实现单元测试。这是一个简单的模型,可以在NBA球员的名字和身高上实现CRUD。在我的模型中,我添加了一个类来描述这些数据,并将其转换为具有ModelViewSet的视图。我想让这些数据只对特定类型的用户(读写用户)可编辑,只对另一个用户(只读用户)可读,并且对未经身份验证的用户不可接受。为此,我创建了一个自定义用户模型,并使用自定义权限将其转换为我的视图。现在我想写几个单元测试来检查:Python 如何在Django框架中使用自定义权限对POST请求进行单元测试?,python,django,unit-testing,django-rest-framework,Python,Django,Unit Testing,Django Rest Framework,各位。我希望你做得很好。我是Django新手,试图学习RESTful开发的基础知识。我只懂Python,所以Django REST框架目前最适合我 现在我正在尝试为我的API实现单元测试。这是一个简单的模型,可以在NBA球员的名字和身高上实现CRUD。在我的模型中,我添加了一个类来描述这些数据,并将其转换为具有ModelViewSet的视图。我想让这些数据只对特定类型的用户(读写用户)可编辑,只对另一个用户(只读用户)可读,并且对未经身份验证的用户不可接受。为此,我创建了一个自定义用户模型,并使
型号.py
:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
ROLES = [('read-only', 'read-only'), ('read-write', 'read-write'),]
role = models.CharField(max_length=32, choices=ROLES, default='read-only')
# Create your models here.
class NBAplayers(models.Model):
first_name = models.CharField(max_length=100)
h_in = models.DecimalField(max_digits=5, decimal_places=2)
h_meters = models.DecimalField(max_digits=5, decimal_places=2)
last_name = models.CharField(max_length=120)
def __str__(self):
return self.first_name
class TestUserBase(TestCase):
username = 'randomuser'
password = 'randompassword'
def setUp(self):
super().setUp()
User = get_user_model()
self.user = User.objects.create_user(username='randomuser',
password='randompassword')
self.user.role = self.user_type
self.user.save()
class ReadWriteUserTest(TestUserBase):
url = urls.reverse('Players list-list')
user_type = 'read-write'
def setUp(self):
super().setUp()
# self.assertTrue(self.client.login(username=self.username,
#password=self.password))
def test_read_write_user_GET_REQUEST(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 200)
def test_read_write_user_POST_REQUEST(self):
response = self.client.post(self.url, {
'id':'4'
'first_name':'John',
'h_in' : '77',
'h_meters' : '1.96',
'last_name' : 'Doe',
})
self.assertEqual(response.status_code, 201)
和myviews.py
,其中我添加了自定义权限:
class ReadOnlyPermission(permissions.BasePermission):
def has_permission(self, request, view):
requests = ('POST', 'PUT', 'DELETE', 'PATCH')
user = request.user
if user.is_anonymous: # Not Authenticated
return request.method == 'GET'
else:
if user.role == 'read-write':
return request.method in requests + ('GET',)
else: # Read Only User
return request.method == 'GET'
class NBAPlayersViewSet(viewsets.ModelViewSet):
serializer_class = NBAplayersSerializer
queryset = NBAplayers.objects.all()
permission_classes = [ReadOnlyPermission]
最后,我的tests.py
:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
ROLES = [('read-only', 'read-only'), ('read-write', 'read-write'),]
role = models.CharField(max_length=32, choices=ROLES, default='read-only')
# Create your models here.
class NBAplayers(models.Model):
first_name = models.CharField(max_length=100)
h_in = models.DecimalField(max_digits=5, decimal_places=2)
h_meters = models.DecimalField(max_digits=5, decimal_places=2)
last_name = models.CharField(max_length=120)
def __str__(self):
return self.first_name
class TestUserBase(TestCase):
username = 'randomuser'
password = 'randompassword'
def setUp(self):
super().setUp()
User = get_user_model()
self.user = User.objects.create_user(username='randomuser',
password='randompassword')
self.user.role = self.user_type
self.user.save()
class ReadWriteUserTest(TestUserBase):
url = urls.reverse('Players list-list')
user_type = 'read-write'
def setUp(self):
super().setUp()
# self.assertTrue(self.client.login(username=self.username,
#password=self.password))
def test_read_write_user_GET_REQUEST(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 200)
def test_read_write_user_POST_REQUEST(self):
response = self.client.post(self.url, {
'id':'4'
'first_name':'John',
'h_in' : '77',
'h_meters' : '1.96',
'last_name' : 'Doe',
})
self.assertEqual(response.status_code, 201)
)
使用AUTH\u user\u MODEL='api\u basic.user'
将自定义用户添加到全局设置所需的上述所有代码。所以,我阅读了文档,四处搜索,试图理解如何编写这个特定的测试,我基本上遵循了每个人使用的一般结构。我在命令行上单独运行了代码,在运行response=self.client.post(self.url,{…
之后,我得到了以下错误:
django line 750, in post self.extra = extra AttributeError: 'str' object has no attribute 'extra'
有谁能解释一下这意味着什么,以及如何使用它来修复我的测试?事先感谢您提供的任何帮助或意见。干杯