2016-06-23 5 views
-1

私はFlaskアプリケーションを作成しており、テストを書く過程にあります。私のfoo/__init__.pyでは、私は、configファイルをお読みください。グローバル設定ファイルでアプリケーションをテストするにはどうすればよいですか?

from flask import Flask 

app = Flask(__name__) 

from .conf import read_config  
settings = read_config() 

、私はテストが非常に困難に私のアプリケーション全体でグローバルオブジェクトとしてfoo.settingsを使用しています。例えば

settingsオブジェクトがコードは本質的にステートフル作り、fooからインポートされるため、上記経路において

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は関数のパラメータではないので、単にオブジェクトをモックすることはできません。

私はアプリケーションをリファクタリングしようとしていますが、このようなグローバルスコープのオブジェクトを使用することは避けられません。私のsettingsオブジェクトのようなグローバルオブジェクトに依存する関数をテストするための受け入れられた方法がありますか、これをリファクタリングしてテストするのが簡単な方法はありますか?

+2

['unittest.mock.patch.dict'](https://docs.python.org/3/library/unittest.mock.html#unittest.mock .patch.dict)それです。その後、特定のキーまたはすべてを置き換えることができます。 – jonrsharpe

+0

@jonrsharpeそれは有望そうです - 私はそれを見てみましょう。リソースへの感謝! – erip

答えて

1

1つのオプションは、Flaskのネイティブapp.configを使用することです。

実際に設定がアプリそのものの場合は、設定ファイルで複数の設定(prod、test、dev)を定義し、設定からアプリを読み込む場所に基づいて設定できます。テストではテストを使用し、プロダクションはenvから設定名のプロダクションを読み込みます。 var、defaultはdevです。

Miguel GrinbergのFlaskメガチュートリアルでは、非常にうまくマッピングされています。 (彼の本のために、彼のメガチュートリアルでは、同じように動作します)このリポジトリをチェックアウト:

関連する問題