测试瓶路线是否存在

2024-05-22 19:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建大量烧瓶路径using regular expressions。我想进行一个单元测试,检查是否存在正确的路由,以及是否存在错误的路由404。

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

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


Tags: 方法路径服务器travis应用程序路由烧瓶选项
3条回答

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)

在不执行附加视图函数的情况下测试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文档:

you get a tuple in the form (endpoint, arguments) if there is a match.

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

在单元测试中使用^{} object。该方法返回一个^{} instance(a^{} subclass),使得测试路由变得简单。

调用TestClient的结果是一个^{} object,以查看它是作为200还是404响应来测试^{} 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)

请参阅烧瓶文档的Testing Flask Applications chapter

相关问题 更多 >

    热门问题