Сбой теста с помощью `django.db.utils.IntegrityError` - PullRequest
0 голосов
/ 20 мая 2019

Мой тестовый пример дает мне следующую ошибку.

django.db.utils.IntegrityError: вставить или обновить таблицу «django_admin_log» нарушает ограничение внешнего ключа "django_admin_log_user_id_c564eba6_fk_auth_user_id" ДЕТАЛИ: Ключ (user_id) = (1) отсутствует в таблице "auth_user".

В моем классе просмотра у меня есть запись в журнале, во время теста request.user.id всегда Нет. так что используйте anonymous_user, который равен id = 1. (Если я закомментировал LogEntry.objects.log_action(), тестовый проход)

Мой взгляд на класс:

class MyView(CreateAPIView):
    # For admin LogEntry
    anonymous_user_id = get_anonymous_user_id()

    def post(self, request, *args, **kwargs):
        """
        ...
        """

        LogEntry.objects.log_action(
            user_id=request.user.id or self.anonymous_user_id,
            content_type_id=self.content_type_id,
            object_id=target.id,
            object_repr=str(target),
            action_flag=ADDITION,
            change_message='message',
        )

        return Response({}, status=status.HTTP_200_OK)

Мой тест:

def test_myview_append_api_works(self):

    def myview_append(url, p1, p2):
        resp = None
        resp = self.client.post(url, data={'paraphrase': p1, 'data_id': p2})
        return resp

    url = reverse('api-my_data:paraphrase_append')
    current_qa = Qa.objects.all()[0]  # get current existing qa = the qa created in the setUp

    p1 = 'test paraphrase'
    p2 = target.id
    resp = myview_append(url, p1, p2)
    self.assertEqual(resp.status_code, status.HTTP_200_OK)

Я пытался использовать request_factory для установки пользователя в запросе, но это не сработало

        request = self.request_factory.post(url,  data={'paraphrase': p1, 'qa_id': p2})
        request.user = self.user

        resp = MyView.as_view()(request)

Может ли кто-нибудь помочь мне с этим тестом.

1 Ответ

2 голосов
/ 21 мая 2019

LogEntry.user требует фактической записи пользователя в вашей базе данных.Как часть вашего setUp-кода в тесте, вам нужно создать пользователя, чей идентификатор будет сопоставлен с идентификатором, возвращаемым get_anonymous_user_id.

Примечание: вы идете по пути боли с

class MyView(CreateAPIView):
    # For admin LogEntry
    anonymous_user_id = get_anonymous_user_id()

Если по какой-либо причине данные изменятся так, что get_anonymous_user_id вернет другое значение, серверу потребуется перезагрузить компьютер, чтобы обновить это значение, поскольку класс будет загружен в память.Другая потенциальная проблема заключается в том, что если get_anonymous_user_id попадает в базу данных, это означает, что когда ваш класс загружается в память, он работает, ударяясь о базу данных.Если этот SQL-запрос будет работать плохо, то развертывание займет больше времени.

...