如何正确测试 django UpdateView?

Zer*_*rox 5 python django unit-testing django-views

我有以下单元测试

def test_category_update_view(self):
    """
    Make sure that a category can be updated
    :return: 
    """
    self.log_user_1_in()

    self.assertEqual('Bacon', self.category.name)

    res = self.client.put(
        reverse(
            'calendars:categories:edit_category',
            kwargs={'calendar_pk': self.calendar.id, 'pk': self.category.id}
        ),
        urlencode({'name': 'bacon is yummy'})
    )

    self.assertEqual('bacon is yummy', self.category.name)

    self.assertEqual(302, res.status_code)
    self.assertEqual(
        reverse('calendars:categories:category_list', kwargs={'calendar_pk': self.calendar.id}),
        res.url
    )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

正如您所看到的,它说表单无效,所以我的问题是它为什么无效?测试客户端不应该使用我提供的数据吗?我以相同方式完成的 POST 请求工作正常并传递正确的数据。

我有一段时间没有发帖了,如果这有点含糊,请原谅我。如果您需要更多信息来帮助我,请告诉我。

Joh*_*han 0

当您使用self.client.put/post/patch...etc 发布数据时,您不应该对要发送的数据进行 urlencode。你的字典{'name': 'bacon is yummy'}最终会被转换成'name=bacon+is+yummy',然后 Django 无法解码你发送的字段(如果你想将它作为GET参数发送,那么这是有意义的)。

相反,尝试使用此代码而不使用 urlencode:

res = self.client.put(
    reverse(
        'calendars:categories:edit_category',
        kwargs={'calendar_pk': self.calendar.id, 'pk': self.category.id}
    ),
    {'name': 'bacon is yummy'}
)
Run Code Online (Sandbox Code Playgroud)

来源