繁体   English   中英

测试失败,出现“ django.db.utils.IntegrityError”

[英]Test fails with `django.db.utils.IntegrityError`

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

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期间始终有一个日志条目。 因此它使用id = 1的anonymous_user 。(如果我注释掉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)

谁能帮助我进行这项测试。

LogEntry.user需要数据库中的实际用户记录。 作为测试中setUp代码的一部分,您需要创建一个用户,该用户的ID将映射到get_anonymous_user_id返回的ID。

旁注,您正在沿着痛苦的道路前进

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

如果由于某种原因数据发生更改,使得get_anonymous_user_id将返回不同的值,则服务器将需要重新启动以更新此值,因为该类将被加载到内存中。 另一个潜在的问题是,如果get_anonymous_user_id命中数据库,则意味着当您的类正被加载到内存中时,它正在命中数据库。 如果该sql查询的性能不佳,则部署将需要更长的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM