如何在单元测试中故意使用url_for()构建错误的URL?

时间:2016-07-25 15:00:58

标签: python unit-testing url flask

我正在用Flask编写用Python编写的API的单元测试。具体来说,我想测试我的路由的错误处理是否正常工作,所以我想故意构建缺少参数的URL。我想通过使用url_for()来避免硬编码,但这不允许您丢失参数,那么如何构建错误的URL?

1 个答案:

答案 0 :(得分:2)

说到url_for,它会生成两种网址。如果有命名路线,比如

@app.route('/favorite/color/<color>')
def favorite_color(color):
    return color[::-1]

然后,网址参数必需

url_for('favorite_color')
BuildError: Could not build url for endpoint 'favorite_color'. Did you forget to specify values ['color']?

但是,路径中不存在的任何参数都只会转换为查询字符串参数:

print(url_for('favorite_color', color='blue', no='yellooooowwww!'))
/favorite/color/blue?no=yellooooowwww%21

因此,当您要求提供缺少参数的网址时,您要求的是没有路由的网址。您无法为此构建URL,因为flask正在尝试为存在的端点构建参数。

您可以做的最好的事情是使用超出界限的参数值,例如

url_for('favorite_color', color='toaster')

烤面包机不是真正的颜色,因此应返回404。缺少参数也可能在不同的上下文中有意义,因此您必须考虑到这一点。 如果你真的想要缺少参数,你真正想要做的是使用查询字符串参数。但是,如果您确定服务器上实际上不存在服务器上不存在的URL,那么您可以执行以下操作:

url_for('favorite_color', color='fnord').replace('/fnord', '')