簡體   English   中英

查找密鑰 [user] 失敗<User: test>單元測試時的異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM