Flask蓝图单元测试

18

有没有一种好的实践方法来对Flask蓝图进行单元测试?

http://flask.pocoo.org/docs/testing/

我没有找到对我有帮助或足够简单的东西。

// 编辑
这是我的代码:

# -*- coding: utf-8 -*-
import sys
import os
import unittest
import flask

sys.path = [os.path.abspath('')] + sys.path

from app import create_app
from views import bp


class SimplepagesTestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('development.py')
        self.test_client = self.app.test_client()

    def tearDown(self):
        pass

    def test_show(self):
        page = self.test_client.get('/')
        assert '404 Not Found' not in page.data


if __name__ == '__main__':
    unittest.main()

在这种情况下,我测试蓝图而不是整个应用程序。为了测试蓝图,我已将应用程序的根路径添加到sys.path中。现在我可以导入create_app函数来创建应用程序。我也初始化了test_client

我认为我找到了一个好的解决方案。或者还有更好的方法吗?

3个回答

21

如果这有助于任何人,我做了以下操作。我基本上将测试文件作为我的Flask应用程序。

我做了以下操作,希望对大家有所帮助。我基本上是把测试文件变成了我的Flask应用程序。

from flask import Flask
import unittest

app = Flask(__name__)

from blueprint_file import blueprint
app.register_blueprint(blueprint, url_prefix='')

class BluePrintTestCase(unittest.TestCase):

    def setUp(self):
        self.app = app.test_client()

    def test_health(self):
        rv = self.app.get('/blueprint_path')
        print rv.data


if __name__ == '__main__':
    unittest.main()

13

蓝图与应用程序非常相似。我猜想你想测试test_client请求。

如果你想将蓝图作为应用程序的一部分进行测试,则与应用程序没有任何区别。

如果你想将蓝图作为扩展进行测试,则可以创建带有自己蓝图的测试应用程序并对其进行测试。


1
谢谢,我想我明白了。我会尽快发布/编辑结果。 - danbruegge

0

我在一个应用程序中有多个API,因此有多个带有url_prefix的蓝图。我不喜欢在测试其中一个API时必须为所有路径添加前缀。我使用了以下类来包装蓝图的test_client

class BlueprintClient():
    def __init__(self, app_client, blueprint_url_prefix):
        self.app_client = app_client
        self.blueprint_url_prefix = blueprint_url_prefix.strip('/')

    def _delegate(self, method, path, *args, **kwargs):
        app_client_function = getattr(self.app_client, method)
        prefixed_path = '/%s/%s' % (self.blueprint_url_prefix, path.lstrip('/'))
        return app_client_function(prefixed_path, *args, **kwargs)

    def get(self, *args, **kwargs):
        return self._delegate('get', *args, **kwargs)

    def post(self, *args, **kwargs):
        return self._delegate('post', *args, **kwargs)

    def put(self, *args, **kwargs):
        return self._delegate('put', *args, **kwargs)

    def delete(self, *args, **kwargs):
        return self._delegate('delete', *args, **kwargs)

app_client = app.test_client()
api_client = BlueprintClient(app_client, '/api/v1')
api2_client = BlueprintClient(app_client, '/api/v2')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接