测试失败并显示 `django.db.utils.IntegrityError`

Test fails with `django.db.utils.IntegrityError`

我的测试用例给出了以下错误。

django.db.utils.IntegrityError: insert or update on table "django_admin_log" violates foreign key constraint "django_admin_log_user_id_c564eba6_fk_auth_user_id" DETAIL: Key (user_id)=(1) is not present in table "auth_user".

在我看来class我有一个日志条目,在测试期间request.user.id总是None。所以它使用 anonymous_user 即 id = 1。 (如果我注释掉LogEntry.objects.log_action(),测试通过)

我的观点class:

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)

谁能帮我做这个测试。

LogEntry.user 需要数据库中的实际用户记录。作为测试中设置代码的一部分,您需要创建一个用户,其 ID 将映射到 return 由 get_anonymous_user_id 编辑的 ID。

旁注,您正走在痛苦的道路上

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

如果由于某种原因数据发生变化,get_anonymous_user_id 会 return 一个不同的值,服务器将需要重新启动以更新此值,因为 class 将是加载到内存中。另一个潜在的问题是,如果 get_anonymous_user_id 命中数据库,这意味着当你的 class 被加载到内存中时,它 运行 命中数据库。如果 sql 查询执行不佳,则部署时间将更长。