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

时间:2019-05-20 08:17:19

标签: python django postgresql django-tests

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

  

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始终为None。因此它使用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 个答案:

答案 0 :(得分:2)

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查询的性能不佳,则部署将需要更长的时间。