首页 > 解决方案 > 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)

标签: djangounit-testingviewdjango-testingdjango-tests

解决方案


推荐阅读