如何为webapp2中同名多复选框的POST请求进行单元测试

4 投票
2 回答
1814 浏览
提问于 2025-04-17 01:32

我在使用webapp2的时候,创建了一个表单的单元测试,这个表单里有投票的复选框,所以可以为vote字段提交多个值,这些值可以通过request.POST.getall('vote')来获取:

<input type="checkbox" name="vote" value="Better">
<input type="checkbox" name="vote" value="Faster">
<input type="checkbox" name="vote" value="Stronger">

在单元测试中,我尝试传递一个列表:

response = app.get_response('/vote',
  POST={'vote': [u'Better', u'Faster', u'Stronger']},
  headers=[('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8')]
)

但是看起来它只是被转换成了一个字符串:

votes = self.request.POST.getall('vote')
# => [u"[u'Better', u'Faster', u'Stronger']"]

我该如何传递多个vote的值,以便通过request.POST.getall()获取到一个列表呢?

2 个回答

1

webtest库对于这些测试案例很有帮助。

http://webtest.pythonpaste.org/en/latest/index.html#form-submissions

4

POST数据是通过查询字符串编码的方式来处理的,如果有多个相同名称的项目,就会通过重复这个名称来表示不同的值。例如:

vote=Better&vote=Faster&vote=Stronger

不过,Python有一些库函数可以帮你完成这个工作:

urllib.urlencode({
  'vote': ['Better', 'Faster', 'Stronger'],
}, True)

urlencode函数中,第二个参数(True)叫做'doseq',它的作用是告诉urlencode把序列编码成一个个独立的元素。

撰写回答