django - Django 单元测试:AssertEqual 不将 PermissionDenied 与 403 进行比较,并在 get_object() 中提前终止
问题描述
我真的希望你能对我在对我的帖子视图进行单元测试时遇到的一个令人费解的情况有所了解。我基本上是在尝试根据用户测试不同的帖子权限,例如:
- 客人(匿名),
- 会员(注册),和
- 互相关注的成员(朋友)
当我运行单元测试时,测试成员(注册用户)是否可以查看仅对朋友可见的帖子(相互关注)的功能出错:
======================================================================
ERROR: test_member_user_post_detail_friends_permission (journal.tests.test_views.TestPostDetailView)
----------------------------------------------------------------------
当我遵循发生异常的那一行时,它会引导我进入我get_object()
的PostDetailView
班级,那里的测试似乎过早结束(下面标记的行):
def get_object(self, queryset=None):
obj = super(PostDetailView, self).get_object(queryset=queryset)
# Logged in user's friends ids (Users who they are following)
my_friends = Follower.objects.filter(user_id=self.request.user.id).values(
"follow_to"
)
# Post owner's friends id (Users who the post owner is following)
their_friends = Follower.objects.filter(user_id=obj.user.id).values("follow_to")
if obj.permission == "friend": # viewable only by friends or staff/moderators
if self.request.user.is_authenticated:
if self.request.user.is_staff or self.request.user.is_moderator:
return obj
if self.request.user.id == obj.user.id:
return obj
# Check if they are following each other
if self.request.user.id in [
i["follow_to"] for i in their_friends
] and obj.user.id in [i["follow_to"] for i in my_friends]:
return obj
else:
raise PermissionDenied <-------------------------------------------------Issue here
if self.request.user.is_anonymous and obj.permission != "public":
raise PermissionDenied
return obj
期待:
self.assertEqual(response.status_code, 403) 应该是 True, 403 == 403
问题:
- 现在我不明白为什么我的
self.assertEqual(response.status_code, 403)
陈述不返回 True 因为不应该提高PermissionDenied
==403
? - 为什么甚至在我的单元测试可以运行 self.assertEqual 行之前它就提前终止了?
- 如何更改代码以使单元测试成功运行?
编辑:愚蠢的我,我似乎忘记粘贴实际测试:
def test_member_user_post_detail_friends_permission(self):
"""
Test if logged in user can view friend permission posts
"""
request = self.factory.get("/journal/post/3/")
middleware = SessionMiddleware()
middleware.process_request(request)
request.session.save()
request.user = self.user_1
response = PostDetailView.as_view()(request, pk=self.friends_post.id)
self.assertEqual(response.status_code, 403)
Edit2:如果我使用client(),它可以工作,但如果我使用factory(),它就不行。是什么赋予了?
self.client.login(username="user_1", password="123456")
response = self.client.get('/journal/post/3/')
self.assertEqual(response.status_code, 403)
解决方案
推荐阅读
- javascript - 从表单的一部分解析数组
- html - Flutter:仅显示小部件的一部分
- docker - Kubernetes w/Docker For Windows:如何引用私有注册表?
- php - 无法在表格中显示数据
- python - 如何在 Ghidra 中获取 currentProgram 对象?
- excel - Excel - 错误处理 - 根据另一个单元格更改一个单元格的文本
- python - 使用python从csv创建自定义json文件
- swift - SwiftUI 动画外部绑定具有相同的 `withAnimation` 样式
- database - 将数据库还原到 MongoDB
- c# - 如何从 Visual Studio 2019 中的 Winforms C# 项目中删除或卸载 Avalonia