微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 单元测试:AssertEqual 不将 PermissionDenied 与 403 进行比较,并在 get_object()

如何解决Django 单元测试:AssertEqual 不将 PermissionDenied 与 403 进行比较,并在 get_object()

我真的希望您能对我在对帖子视图进行单元测试时遇到的一个令人费解的情况有所了解。我基本上是在尝试根据用户测试不同的帖子权限,例如:

  1. 访客(匿名),
  2. 会员(注册),和
  3. 互相关注的成员(朋友)

当我运行单元测试时,测试成员(注册用户)是否可以查看仅对朋友可见(相互关注)的帖子的功能出错:

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

问题:

  1. 现在我不明白为什么我的 self.assertEqual(response.status_code,403) 语句不返回 True 因为不应该引发 PermissionDenied == 403
  2. 为什么它甚至在我的单元测试可以运行 self.assertEqual 行之前就提前终止?
  3. 如何更改代码才能使单元测试成功运行?

编辑:我傻我似乎忘记粘贴实际测试:

    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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。