测试失败并显示 `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 查询执行不佳,则部署时间将更长。
我的测试用例给出了以下错误。
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 查询执行不佳,则部署时间将更长。