Django TestCase slef.client.patch выдает ошибку 404
Я хочу протестировать функцию обновления набора представлений
from rest_framework.viewsets import ModelViewSet
@extend_schema(tags=['Customers'])
class CustomerViewSet(ModelViewSet):
""" This view can be used to see all the customers"""
serializer_class = CustomerSerializer
.....
def update(self, request, *args, **kwargs):
return self._update_customer(request, *args, **kwargs)
Маршрут отображается здесь (как и другие наборы представлений):
router.register(r'customers', CustomerViewSet, basename='customer')
Как и для других моих наборов представлений, где это работает, я тестирую метод обновления, разрешая его в моем тестовом примере
from django.test import TestCase
from rest_framework.reverse import reverse
......
class CustomerUpdateViewTest(TestCase):
.....
def test_customer_missing(self):
url = reverse('customer-detail', [2])
token = create_access_token(self.my_user)
data = {
'customer': 'new name customer'
}
response = self.client.patch(url, data,
content_type="application/json",
HTTP_AUTHORIZATION=f'Bearer {token}')
Я уже создал в методе настройки много клиентов. Но инструкция self.client.patch всегда выдает 404 ошибку
В моем запущенном приложении, путь - /api/customers/x (как в моем тесте, где x = идентификатор клиента) и является HTTP-глаголом PATCH
Для моих похожих взглядов, я тестирую очень похожим способом и это работает.
Когда я указываю неправильный токен, у меня возникает ошибка 401, которая, с моей точки зрения, указывает на то, что url правильный.
Сталкивались ли вы уже с такой проблемой? Если да, то что я могу сделать, чтобы решить эту проблему?
Спасибо большое PTomasz
Спасибо также toyota Supra
Проблема заключалась в пользователе, с которым я вызывал конечную точку
В коде Django (модели) пользователь имеет тип :
from django.contrib.auth.models import AbstractUser
class User(AbstractUser)
Проблема заключалась в пользователе, с которым я вызывал конечную точку
У этого пользователя есть атрибут is_superuser = False
Я вызываю конечную точку с пользователем, который не является суперпользователем
Вызов конечной точки с пользователем, имеющим атрибут is_superuser = True, будет успешным
Для меня это было немного сложно, потому что ошибка 404, с моей точки зрения, не является истинной,
за этой 404 ошибкой скрывается проблема авторизации для пользователя, который не является суперпользователем (или не имеет прав на изменение клиента)
Я получаю ту же ошибку, если использую в реверсе значение pk, которое не существует для клиента
Например, как я использую
url = reverse('customer-detail', [2])
если у меня нет клиента, чье значение pk = 2,
у меня тоже 404 ошибка
Следовательно,
я использую суперпользователя для вызова конечной точки
, а также замените существующий обратный код на следующий :
url = reverse('customer-detail', [self.customer_to_test.pk])