我正在写一个Flask应用程序,我正在编写测试。在我的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
对象这样的全局对象的函数,或者有没有办法重构它以便更容易测试?
答案 0 :(得分:1)
一种选择是使用Flask的原生app.config。
如果您的设置实际上是针对应用程序本身,则可以在配置文件中定义多个配置(prod,test,dev),并根据您从中加载应用程序的位置来选择配置。测试将使用测试,生产将从env读取配置名称生产。 var,默认为dev。
Miguel Grinberg的Flask mega教程已经很好地绘制出来了。查看这个存储库(对于他的书,但他的大型教程以相同的方式工作):