from flask import Flask, url_for
app = Flask(__name__)
def has_no_empty_params(rule):
defaults = rule.defaults if rule.defaults is not None else ()
arguments = rule.arguments if rule.arguments is not None else ()
return len(defaults) >= len(arguments)
@app.route("/site-map")
def site_map():
links = []
for rule in app.url_map.iter_rules():
# Filter out rules we can't navigate to in a browser
# and rules that require parameters
if "GET" in rule.methods and has_no_empty_params(rule):
url = url_for(rule.endpoint, **(rule.defaults or {}))
links.append((url, rule.endpoint))
# links is now a list of url, endpoint tuples
# Get a new MapAdapter instance. For testing purpose, an empty string is fine
# for the server name.
adapter = app.url_map.bind('')
# This raise werkzeug.exceptions.NotFound.
adapter.match('/unknown')
# This raises werkzeug.exceptions.MethodNotAllowed,
# Although the route exists, the POST method was not defined.
adapter.match('/users', method='POST')
# No exception occurs when there is a match..
adapter.match('/users')
adapter.match('/users/1')
来自Werkzeug文档:
you get a tuple in the form (endpoint, arguments) if there is a match.
Martjin的答案肯定能解决您的问题,但有时您没有时间(或将要)模拟您调用的所有组件,而这些组件正是您想要测试存在性的路径。
你为什么要嘲笑我?好吧,调用
get('some_route')
将首先检查此路由是否存在,然后。。。它将被处决!如果视图是一个复杂的视图,并且您需要有fixture、envs变量和任何其他准备工作(如果路由存在),那么您需要重新考虑您的测试设计。
如何避免:
您可以在应用程序中列出所有路由。清单上有你正在测试的那个。
在下面的示例中,您可以通过站点地图的实现在实践中看到这一点。
参考文献:
get a list of all routes defined in the app
Helper to list routes (like Rail's rake routes)
在不执行附加视图函数的情况下测试URL的另一种方法是使用^{} 的方法^{} 。
测试
来自Werkzeug文档:
在某些测试场景中可能有用。
在单元测试中使用^{} object 。该方法返回一个^{} instance (a^{} subclass ),使得测试路由变得简单。
调用} object ,以查看它是作为200还是404响应来测试^{} attribute :
TestClient
的结果是一个^{或者
请参阅烧瓶文档的Testing Flask Applications chapter。
相关问题 更多 >
编程相关推荐