[英]Failed lookup for key [user] in <User: test> exception when unit testing
我有一個可以send/cancel/accept/delete
好友請求的應用程序,我正在嘗試對其進行測試,但是當我接受一個好友請求並將用戶添加到彼此的好友列表時,我發現Failed lookup for key [user] in <User: test>
異常中。
在我的測試中,我創建了一個好友請求對象並向視圖發送了一個接受get
請求,該視圖應該將每個用戶添加到他們的每個好友列表中並刪除friend_request
。
調試顯示錯誤發生在視圖中的這一行之后: user1.friends.add(user2)
,因此本質上是將user2
添加到user1
好友列表,但將user1
添加到user2
好友列表會引發上面提到的異常。
模型.py
class User(AbstractBaseUser, PermissionsMixin):
name = models.CharField('Full Name', max_length=35, unique=True,
null=False,
blank=False)
friends = models.ManyToManyField("User", blank=True)
def __str__(self):
return self.name
class FriendRequest(models.Model)
to_user = models.ForeignKey(User, related_name='to_user',
on_delete=models.CASCADE)
from_user = models.ForeignKey(User, related_name='from_user',
on_delete=models.CASCADE)
視圖.py
from django.db import transaction
def accept_friend_request(request, pk):
try:
with transaction.atomic():
from_user = User.objects.get(pk=pk)
f_request = FriendRequest.objects.filter(
from_user=from_user,
to_user=request.user
).first()
user1 = f_request.to_user
user2 = from_user
user1.friends.add(user2)
print(user1.friends.all())
user2.friends.add(user1)
print(user2.friends.all())
f_request.delete()
return redirect(request.get_full_path())
except Exception as ex:
print(ex)
return HttpResponse('User does not exist')
在這里,我使用transaction.atomic()
來防止異常破壞 unittest 事務。
測試.py
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(email='test@gmail.com',
name='test',
password='test')
self.user1 = User.objects.create_user(email='test1@gmail.com',
name='test1',
password='test1')
self.client.force_login(self.user)
def test_accept_friend_request(self):
friend_request = FriendRequest.objects.create(from_user=self.user1,
to_user=self.user)
self.client.get(reverse('accept_friend_request',
kwargs={'pk': self.user1.pk}), follow=True)
self.assertIn(self.user, self.user1.friends.all())
self.assertIn(self.user1, self.user.friends.all())
下面是運行測試的結果:(還可以看到第一條print語句的結果和被打印的異常)
Ran 1 test in 1.266s
FAILED (failures=1)
Destroying test database for alias 'default'...
System check identified no issues (0 silenced).
<QuerySet [<User: test1>]>
Failed lookup for key [user] in <User: test>
更新
將 Exception 更改為 IntegrityError 導致以下錯誤:
raise VariableLookupError(django_elasticsearch_dsl.exceptions.VariableLookupError:
Failed lookup for key [user] in <User: test>
看起來 elasticsearch-dsl 與這里的異常有關。
更新
當調試異常消息變為
Failed lookup for key [name] in <FriendRequest: FriendRequest object (1)>
所以我終於設法通過將重定向更改為request.META.get('HTTP_REFERER', '/')
使其正確運行,看起來它在重定向循環方面存在問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.