Джанго [AssertionError: 401! = 201] - PullRequest
0 голосов
/ 16 июня 2019

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

Вот мой 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 = 'admin@admin.com'
    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 = 'admin@mgmail.com'

        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

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

Итак, в чем проблема и как можноЯ это решаю?

1 Ответ

1 голос
/ 23 июня 2019

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

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

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

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


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

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

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

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

...