#django #unit-testing #testing #django-rest-framework #django-testing
Вопрос:
добрые люди, я впервые пишу тестовые примеры для своего API-интерфейса django rest framework. Я использовал аутентификацию по токену и разрешение администратора. Я написал несколько тестов конечных точек 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]
Шаблоны URL-адресов:
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
Продвигайтесь вперед благодаря добрым душам. Это было бы большим подспорьем для меня.
Ответ №1:
Спасибо вам, кто столкнулся и попытался ответить на мой вопрос. Но я понял, что использовал разрешение InAdmin, Поэтому пользователи с правами администратора могут публиковать сообщение в django, чтобы предоставить пользователю разрешение администратора, должно сделать следующее: is_stuff=True
нет is_admin=True
. поэтому моя пользовательская функция по умолчанию должна выглядеть так:
def _create_my_user(self):
my_user = MyUser.objects.create_user(
**self.my_dummy_user,
)
my_user.is_stuff = True
my_user.save()
return {
"my_user": my_user,
}