【问题标题】:Why is my Django test failing when the view actually works?当视图实际工作时,为什么我的 Django 测试失败了?
【发布时间】:2020-05-28 14:56:33
【问题描述】:

我有一个基于类的视图,可以在浏览器中按设计工作。我正在尝试为视图编写单元测试,但它们一直失败。我想知道为什么。视图(UserPassesTest 是用户是否是超级用户):

class EditUserView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
    """handles get and post for adding a new AEUser"""
    template_name = 'editUser.html'
    title = 'Edit User'

    def get(self, request, *args, **kwargs):
        """handles the GET"""
        post_url = reverse('edit_user', args=[kwargs['user_id']])
        usr = get_object_or_404(AEUser, pk=kwargs['user_id'])
        form = EditUserForm(initial={'is_active':usr.is_active, 'is_superuser':usr.is_superuser}, \
            user=usr, request=request)
        return render(request, self.template_name, \
            {'title_text':self.title, 'post_url':post_url, 'form':form})

测试用例:

class TestEditUser(TestCase):
    """test the AddUser view"""

    @classmethod
    def setUpTestData(cls):
        cls.user = AEUser.objects.create_user(username='shawn', email='shawn@gmail.com', password='test')
        cls.user.is_superuser = True
        cls.user.save()

    def setUp(self):
        self.client = Client()

    def test_get(self):
        """tests the GET"""
        self.client.login(username=self.user.username, password=self.user.password)
        get_url = reverse('edit_user', args=[self.user.id])
        response = self.client.get(get_url, follow=True)
        self.assertEqual(self.user.is_superuser, True)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'editUser.html')

我在测试用例中有 3 个断言。如果我注释掉最后两个,并且只断言用户是超级用户,则测试通过。但是,无论出于何种原因,在其他两个断言上,我都失败了。我收到的错误是:

AssertionError: False is not true : Template 'editUser.html' was not a template used to render the response. Actual template(s) used: 404.html, base.html,这让我相信 get_object_or_404 调用是触发失败的原因。这个测试用例我哪里出错了?谢谢!

【问题讨论】:

  • 我觉得自己很愚蠢。我正在尝试从用户那里提取密码,该密码不匹配(密码哈希!='test')。在登录中用“test”替换密码,一切正常。

标签: django unit-testing


【解决方案1】:

测试应该是:

class TestEditUser(TestCase):
    """test the AddUser view"""

    @classmethod
    def setUpTestData(cls):
        cls.user = AEUser.objects.create_user(username='shawn', email='shawn@gmail.com', password='test')
        cls.user.is_superuser = True
        cls.user.save()

    def setUp(self):
        self.client = Client()

    def test_get(self):
        """tests the GET"""
        self.client.login(username=self.user.username, password='test')
        get_url = reverse('edit_user', args=[self.user.id])
        response = self.client.get(get_url, follow=True)
        self.assertEqual(self.user.is_superuser, True)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'editUser.html')

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2021-11-19
    • 2021-02-09
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多