单元测试时在 <User: test> 异常中查找键 [user] 失败
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
好友列表抛出上述异常。
models.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)
views.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 事务。
tests.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', '/')
使其正确 运行,看起来重定向循环有问题。
我有一个可以 send/cancel/accept/delete
好友请求的应用程序,我正在尝试对其进行测试,但是当我接受好友请求并将用户添加到彼此的好友列表时,我得到 Failed lookup for key [user] in <User: test>
异常。
在我的测试中,我创建了一个好友请求对象并向视图发送一个接受 get
请求,该视图应将每个用户添加到他们的每个好友列表并删除 friend_request
.
调试显示错误发生在视图中的这一行之后:user1.friends.add(user2)
,所以基本上 user2
被添加到 user1
好友列表,但添加 user1
user2
好友列表抛出上述异常。
models.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)
views.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 事务。
tests.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', '/')
使其正确 运行,看起来重定向循环有问题。