2016-06-23 65 views
-1

我正在編寫一個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對象這樣的全局對象的函數,還是有一種方法可以重構這個方法,使得它更易於測試?

+2

您可以['unittest.mock.patch.dict'](https://docs.python.org/3/library/unittest.mock.html#unittest.mock .patch.dict)。然後你可以替換特定的鍵或整個事情。 – jonrsharpe

+0

@jonrsharpe這似乎很有希望 - 我會看看。歡呼的資源! – erip

回答

1

一個選擇是使用Flask的本地app.config。

如果您的設置實際上是對應用程序本身,你可以在配置文件中定義多個CONFIGS(產品,測試,開發),以及基於從你選擇的配置,你加載的應用程序。測試將使用測試,生產將從env讀取配置名稱生產。 var,並且默認是dev。

Miguel Grinberg的Flask mega tutorial已經很好地繪製出來了。看看這個倉庫(爲他的書,但他的超級教程的工作方式相同):

相關問題