python - 查找密钥 [user] 失败单元测试时的异常
问题描述
我有一个可以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())
下面是运行测试的结果:(也可以看到第一个打印语句的结果和正在打印的异常)
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', '/')
,看起来它在重定向循环方面存在问题。
推荐阅读
- google-app-engine - 将 App Engine 灵活降级为 App Engine 标准环境
- sql - Oracle 在 xmlagg 函数中变得与众不同
- azure - 使用 gzip 压缩的 Azure 数据工厂 blob 数据集开始引发验证错误
- c# - 使用参数在 c# 中运行 linux 可执行文件
- css - 为什么 * 选择器会覆盖类选择器?
- outlook-web-addins - 使用适用于 Mac 的 Outlook 桌面客户端从可操作卡片调用加载项
- angular - app.module.ts 中的导入无法全局运行
- javascript - HighChart 堆叠列 - 动态刷新类别和系列
- boolean-logic - 试图用只有四组“真”指标来简化卡诺图
- python-3.x - 当 singleShot 为 True 时,QTimer 永远不会触发超时