如何正确测试 Django UpdateView?

问题描述 投票:0回答:1

我有以下单元测试

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
    )

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

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

python django unit-testing django-views
1个回答
0
投票

当您使用

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

相反,请尝试使用此代码without

urlencode

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

来源

© www.soinside.com 2019 - 2024. All rights reserved.