如何使用全局设置文件测试应用程序?

时间:2016-06-23 11:51:24

标签: unit-testing python-3.x testing flask global-variables

我正在写一个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对象这样的全局对象的函数,或者有没有办法重构它以便更容易测试?

1 个答案:

答案 0 :(得分:1)

一种选择是使用Flask的原生app.config。

如果您的设置实际上是针对应用程序本身,则可以在配置文件中定义多个配置(prod,test,dev),并根据您从中加载应用程序的位置来选择配置。测试将使用测试,生产将从env读取配置名称生产。 var,默认为dev。

Miguel Grinberg的Flask mega教程已经很好地绘制出来了。查看这个存储库(对于他的书,但他的大型教程以相同的方式工作):