首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >测试Flask路由是否存在

测试Flask路由是否存在
EN

Stack Overflow用户
提问于 2015-07-30 04:03:00
回答 3查看 12.8K关注 0票数 14

我正在创建大量的瓶子路由using regular expressions。我希望有一个单元测试来检查是否存在正确的路由和不正确的路由404。

这样做的一种方法是启动本地服务器并使用urllib2.urlopen等。但是,我希望能够在Travis上运行此测试,我假设这不是一个选项。

有没有其他方法可以让我在应用程序上测试路由?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
with app.test_client() as c:
    response = c.get('/some/path/that/exists')
    self.assertEquals(response.status_code, 200)

代码语言:javascript
复制
with app.test_client() as c:
    response = c.get('/some/path/that/doesnt/exist')
    self.assertEquals(response.status_code, 404)

请参阅Flask文档的 chapter

票数 22
EN

Stack Overflow用户

发布于 2018-02-27 02:54:49

Martjin的答案肯定解决了你的问题,但有时你没有时间(或意愿)模拟你想要测试是否存在的路由中调用的所有组件。

好吧,调用get('some_route')将首先检查这个路由是否存在,然后...它将被执行!

如果视图是一个复杂的视图,并且您需要具有fixture、envs变量和任何其他准备,以便在路由存在的情况下进行测试,那么您需要重新考虑您的测试设计。

如何避免这种情况:

您可以列出您的应用程序中的所有路线。你正在测试的那张支票在列表中。

在下面的示例中,您可以在实现站点地图的实践中看到这一点。

代码语言:javascript
复制
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)

票数 5
EN

Stack Overflow用户

发布于 2018-08-31 01:20:44

在不执行附加视图函数的情况下测试URL的另一种方法是使用的方法。

代码语言:javascript
复制
from flask import Flask

app = Flask(__name__)

@app.route('/users')
def list_users():
    return ''

@app.route('/users/<int:id>')
def get_user(id):
    return ''

测试

代码语言:javascript
复制
# 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文档:

如果有匹配,你会得到一个形式为(端点,参数)的元组。

这在某些测试场景中可能是有用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31710064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档