【发布时间】:2021-09-05 19:23:27
【问题描述】:
好人,我是第一次为我的 django rest 框架 API 编写测试用例。我使用了令牌身份验证并且是管理员权限。我已经编写了一些 api 端点测试。测试运行良好,无需身份验证。我也在 POSTMAN 中完成了这项工作,并在标头提供了令牌授权,它在那里运行良好。但是,每当我使用令牌身份验证运行单元测试用例并且是管理员权限时,它都会返回 403,断言错误。在过去的两天里,我一直坚持这一点。谁能帮我找出我做错了什么?
我在下面提供我的代码: 我的模特:
class Vendor(models.Model):
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, related_name='myuser')
vendor_name = models.CharField(max_length=100)
vendor_type = models.CharField(max_length=100, choices=Vendor_Type)
display_name = models.CharField(max_length=100)
vendor_mail = models.CharField(max_length=255)
vendor_phone = models.CharField(max_length=15)
vendor_address = models.CharField(max_length=255)
def __str__(self):
return self.display_name
我的序列化器:
class VendorSerializer(serializers.ModelSerializer):
address_details = VendorAddressDetailSerializer(read_only=True, source='detaisaddress')
sales_person = VendorContactSerializer(read_only=True, source='contactperson')
social_account = VendorSocialSerializer(read_only=True, source='vendorsocial')
class Meta:
model = Vendor
fields = ['id','vendor_name', 'vendor_type', 'display_name', 'vendor_mail', 'vendor_phone','vendor_address', 'user', 'address_details', 'sales_person', 'social_account']
我的看法:
class VendorViewSet(viewsets.ModelViewSet):
queryset = Vendor.objects.all()
serializer_class = VendorSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAdminUser]
网址模式:
router = DefaultRouter()
router.register('vendors', VendorViewSet, basename='vendors')
urlpatterns = [
path('', include(router.urls)),
]
最后我的测试用例代码是:
class TestSetUp(APITestCase):
email = "zzm@abcd.com"
phone = "0122xxxxxxx"
name = "zzm"
address = "zzmkk"
password = "1234xxxx"
def setUp(self):
self.user = MyUser.objects.create_user(self.email, self.phone, self.name, self.address, self.password)
self.user.is_admin = True
self.user.save()
self.token = Token.objects.get(user=self.user)
self.vendor_url = reverse('vendors-list')
self.my_dummy_user = {
"email": "temp@gmail.com",
"phone": "01222xxx",
"name": "temp",
"address": "tempxx",
"password": "1234xxxxx",
}
def _create_my_user(self):
my_user = MyUser.objects.create_user(
**self.my_dummy_user,
)
my_user.is_admin = True
my_user.is_superuser = True
my_user.save()
return {
"my_user": my_user,
}
def test_vendor_post_201(self):
data = self._create_my_user()
token = Token.objects.get(user__name= data.get('my_user').name)
vendor_data = {
"vendor_name": "lama",
"vendor_type": "person",
"display_name": "lama co",
"vendor_mail": "lama@gmail.com",
"vendor_phone": "0133xxxxx",
"vendor_address": "xxxxxxxxx",
"user": data.get('my_user').id
}
client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
# headers = {'Authorization': 'token ' + token.key}
res = client.post(self.vendor_url, vendor_data, format="json")
self.assertEqual(res.status_code, 201)
return res.data
感谢善良的灵魂。这对我有很大的帮助。
【问题讨论】:
标签: django unit-testing testing django-rest-framework django-testing