我的测试用例给了我以下错误。
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)
任何人都可以帮助我进行此测试。
答案 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查询的性能不佳,则部署将需要更长的时间。