我正在尝试在我的 Flask 应用程序上测试一些调用外部 API 的路由,我想模拟这些路由。
路由设置如下:
@app.route('/url/<string::arg>')
def route_function(arg):
data = external_api(arg)
response = make_response(data)
# configure response
return response
Run Code Online (Sandbox Code Playgroud)
我最初尝试过这样的事情:
class TestFlaskApp(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
@patch('external_api',
side_effect=mock_api)
def test_flask_route(self, api):
result = app.get('/url/arg')
self.assertEqual(result.status_code, 200)
api.assert_called_once_with('arg')
Run Code Online (Sandbox Code Playgroud)
...失败了。没有调用模拟 API 函数,因为我认为模拟不适用于应用程序上下文。
我也试过这个,认为我可以直接测试路由功能,从而避免使用应用程序上下文:
class TestAppFunctions(unittest.TestCase):
@patch('external_api',
side_effect=mock_api)
def test_flask_function(self, api):
result = my_flask_app.route_function('arg')
self.assertEqual(result.status_code, 200)
api.assert_called_once_with('arg')
Run Code Online (Sandbox Code Playgroud)
...但这也不起作用,因为要做出响应,route_function需要应用程序上下文。
那么有没有办法在应用程序上下文中进行模拟?我还能如何在不触发外部 API 调用的情况下测试这些路由?
在setup.py我需要Flask和Flask-Autodoc.我运行setup.py install并确认已安装两个发行版.
按照指示,我导入了Flask-Autodoc:
from flask.ext.autodoc import Autodoc
Run Code Online (Sandbox Code Playgroud)
但我明白了ModuleNotFoundError: No module named 'flask.ext'.我在Conda Python 3.6环境中,当我创建一个新的虚拟环境并重新安装包含依赖项的包时,会发生同样的事情.
我认为Flask扩展应该从flask.ext模块导入,但这似乎不起作用.我也试过如下:from flask.autodoc import Autodoc,from autodoc import Autodoc,from FlaskAutodoc import Autodoc.