Джанго [AssertionError: 401! = 201]

Я пишу тесты для своего API. Теперь я хочу протестировать метод post.

Вот мой views.py:

class TaskViewSet(viewsets.ModelViewSet):

    queryset = Task.objects.all()
    serializer_class = serializers.TaskSerializer
    authentication_classes = (BasicAuthentication,)
    permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser)

Вот мой tests.py:

class UserFactory(DjangoModelFactory):

    class Meta:
        model = User

    username = 'dima'
    password = 'moonmvm2k14'
    email = '[email protected]'
    is_superuser = True
    is_active = True
    is_staff = True


class TaskFactory(DjangoModelFactory):

    class Meta:
        model = Task

    title = "TASK N1"
    description = "smth"
    person = factory.SubFactory(UserFactory)
    deadline = date.today()


class ViewTest(APITestCase):

    def setUp(self):
        self.task = TaskFactory()

        self.username = 'myuser'
        self.password = 'test' 
        self.email = '[email protected]'

        self.admin = User.objects.create_superuser(self.username, self.password, self.email)

        self.client = APIClient()
        self.client.login(username=self.admin.username, password=self.admin.password)

    def test_post_task(self):
        url = '/task-list/'
        json_tasks = serializers.TaskSerializer(self.task)
        data = json_tasks.data
        response = self.client.post(url, data)
        tasks_count = Task.objects.count()
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(tasks_count, 2)

Но когда я пытаюсь проверить это, я вижу эту ошибку:

AssertionError: 401 != 201

Я не знаю, почему мой тест не проходит с кодом состояния Not Authorized.

Итак, в чем проблема и как я могу ее решить?


person Dima Mishuto    schedule 16.06.2019    source источник
comment
Кажется, URL-адрес /task-list/ дает вам HTTP 401, можете ли вы распечатать тело ответа и добавить его к вопросу?   -  person rdas    schedule 16.06.2019
comment
Вам нужно напечатать response.body, чтобы получить строку тела   -  person rdas    schedule 16.06.2019
comment
Объект 'Response' не имеет атрибута 'body', если вы хотите увидеть response.data, вот: 'detail': ErrorDetail(string='Authentica[59 chars]ed')   -  person Dima Mishuto    schedule 16.06.2019


Ответы (1)


Проблема возникает из-за того, как вы имитируете вход в систему в тестовом примере.

Вы используете метод login() класса APIClient, который подходит, когда у вас есть SessionAuthentication.

Из документов:

Метод login подходит для тестирования API, использующих аутентификацию сеанса, например веб-сайтов, которые включают взаимодействие AJAX с API.


Но, по вашему мнению, вы используете BasicAuthentication (, который на самом деле подходит только для тестирования целей), поэтому вы можете использовать другой метод клиентского класса — force_authenticate:

class ViewTest(APITestCase):
    def setUp(self):
        ...

        self.client = APIClient()
        self.client.force_authenticate(user=self.admin)

Это приведет к тому, что ваш пользователь-администратор действительно войдет в систему, и утверждение кода состояния должно пройти успешно.

person wencakisa    schedule 23.06.2019