我正在编写烧瓶应用程序,并且正在编写测试的过程中。在我的foo/__init__.py
中,我读了一个配置文件:
from flask import Flask
app = Flask(__name__)
from .conf import read_config
settings = read_config()
我在整个应用程序中都使用foo.settings
作为全局对象,这使得测试非常困难。
例如:
import json
from foo import settings
from .helper import get_hosts_status
@app.route("/hosts/status")
def hosts_status():
assert 'is_production' in settings
data = {
"num_hosts_up" : get_hosts_status(settings['is_production'])
}
return json.dumps(data)
在上述路线中,测试代码非常困难,因为settings
对象是从foo
导入的,从而使代码天生实现。由于settings
不是该函数的参数,因此我不能简单地模拟对象。
我一直在试图重构我的应用程序,但是我似乎无法避免使用某种类型的全球范围对象。是否有一种可接受的方法来测试依赖我的settings
对象等全局对象的函数,或者有没有一种方法可以使其更易于测试?
一个选项是使用烧瓶的本机app.config。
如果您的设置实际上是针对应用程序本身的,则可以在配置文件中定义多个配置(prod,test,dev),并基于从何处选择该应用程序。测试将使用测试,生产将从Env读取配置名称生产。var,默认为dev。
Miguel Grinberg的烧瓶Mega Tutorial的绘制得很好。查看此存储库(对于他的书,但他的大型教程的工作方式相同):
- https://github.com/miguelgrinberg/flasky/blob/master/config.py-显示示例配置
- https://github.com/miguelgrinberg/flasky/blob/master/master/tests/test_basics.py-显示测试如何调用测试配置
- https://github.com/miguelgrinberg/flasky/blob/master/master/app/__init__.py-显示如何为部署创建应用程序本身