【问题标题】:How to test an UpdateView in Django?如何在 Django 中测试 UpdateView?
【发布时间】:2020-01-07 18:22:20
【问题描述】:

我正在尝试在 Django 中测试视图 (UpdateView),但这不起作用。是用于编辑用户名和姓的视图(基本)。

这是视图:

class UserProfileEditView(LoginRequiredMixin, UpdateView):
    model = User
    template_name = 'user/edit.html'
    fields = ['first_name', 'last_name']

    def get_success_url(self):
        redirect_to = self.request.GET.get(
            'next',
            reverse('main:user_detail', args=[self.request.user.pk])
        )
        return redirect_to

urls.py 文件中我有这个路径:

path(
    'user/<pk>/edit/',
    views.UserProfileEditView.as_view(),
    name='user_edit'
),

最后这是我编写的测试,我只想测试用户可以将他的名字更改为空白,但这不起作用:

class TestModel(TestCase):
    def test_blank_first_name(self):
        user = factories.UserFactory()
        post_data = {
            'first_name': '',
            'last_name': user.last_name
        }
        response = self.client.post(
            reverse('main:user_edit', kwargs={'pk': user.pk}),
            post_data
        )
        self.assertEqual(response.status_code, 302)
        user.refresh_from_db()
        self.assertEqual(user.first_name, '')

这是我运行python manage.py test时的错误:

AssertionError: 'laugh' != ''

这意味着 first_name 没有像预期的那样从“笑”变成“”。

我做错了什么?

【问题讨论】:

  • 尝试' ' 而不是''
  • 它也不起作用

标签: django unit-testing django-testing


【解决方案1】:

罗曼,我希望你做得很好! 您为什么要尝试使用帖子更新用户?为什么不使用补丁? 另外,为什么您期望 302 重定向而不是 200 OK?

要更新,您需要使用 patch [或 put,如果您提供用户所需的每个字段]。这将导入from rest_framework import status

response = self.client.patch(
    reverse('main:user_edit', kwargs={'pk': user.pk}),
    post_data
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
user.refresh_from_db()
self.assertEqual(user.first_name, '')

希望这对你有用:)

【讨论】:

  • 这不是关于 REST 框架,而是关于常规 Django 视图和表单,它们接受数据作为 POST,并在成功后使用 302 进行重定向。
猜你喜欢
  • 2018-05-29
  • 2023-03-17
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2018-09-27
  • 2016-06-14
相关资源
最近更新 更多