单元测试时的异常,python,django,django-testing"/>

首页 > 解决方案 > 查找密钥 [user] 失败单元测试时的异常

问题描述

我有一个可以send/cancel/accept/delete添加好友请求的应用程序,我正在尝试对其进行测试,但是当我接受好友请求并将用户添加到彼此的好友列表时,我遇到了Failed lookup for key [user] in <User: test>异常。

在我的测试中,我创建了一个朋友请求对象并向视图发送一个接受get请求,该视图应该将每个用户添加到他们的每个朋友列表中并删除friend_request.

调试显示错误发生在视图中的这一行之后:user1.friends.add(user2),所以本质上user2是被添加到user1好友列表但添加user1user2好友列表会引发上面提到的异常。

模型.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())

下面是运行测试的结果:(也可以看到第一个打印语句的结果和正在打印的异常)

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)>

标签: pythondjangodjango-testing

解决方案


所以我终于设法通过将重定向更改为 来使其正常运行request.META.get('HTTP_REFERER', '/'),看起来它在重定向循环方面存在问题。


推荐阅读