我正在创建大量的瓶子路由using regular expressions。我希望有一个单元测试来检查是否存在正确的路由和不正确的路由404。
这样做的一种方法是启动本地服务器并使用urllib2.urlopen等。但是,我希望能够在Travis上运行此测试,我假设这不是一个选项。
有没有其他方法可以让我在应用程序上测试路由?
发布于 2015-07-30 04:23:07
在单元测试中使用Flask.test_client() object。该方法返回一个FlaskClient instance (一个werkzeug.test.TestClient subclass),这使得测试路由变得很简单。
调用TestClient的结果是一个Response object,以查看它是作为200还是404响应来测试Response.status_code attribute
with app.test_client() as c:
response = c.get('/some/path/that/exists')
self.assertEquals(response.status_code, 200)或
with app.test_client() as c:
response = c.get('/some/path/that/doesnt/exist')
self.assertEquals(response.status_code, 404)请参阅Flask文档的 chapter。
发布于 2018-02-27 02:54:49
Martjin的答案肯定解决了你的问题,但有时你没有时间(或意愿)模拟你想要测试是否存在的路由中调用的所有组件。
好吧,调用get('some_route')将首先检查这个路由是否存在,然后...它将被执行!
如果视图是一个复杂的视图,并且您需要具有fixture、envs变量和任何其他准备,以便在路由存在的情况下进行测试,那么您需要重新考虑您的测试设计。
如何避免这种情况:
您可以列出您的应用程序中的所有路线。你正在测试的那张支票在列表中。
在下面的示例中,您可以在实现站点地图的实践中看到这一点。
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 list of all routes defined in the app
Helper to list routes (like Rail's rake routes)
发布于 2018-08-31 01:20:44
在不执行附加视图函数的情况下测试URL的另一种方法是使用的方法。
from flask import Flask
app = Flask(__name__)
@app.route('/users')
def list_users():
return ''
@app.route('/users/<int:id>')
def get_user(id):
return ''测试
# 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文档:
如果有匹配,你会得到一个形式为(端点,参数)的元组。
这在某些测试场景中可能是有用的。
https://stackoverflow.com/questions/31710064
复制相似问题