2017-01-29 75 views
0

我目前正在寫一個簡單的燒瓶應用程序,並想測試我的配置選項正在工作。使用pytest,我該如何測試我的Flask應用程序在配置文件和沒有配置文件的配置?

這裏是我的config.py:

import logging 
import logging.handlers 
import os 


class BaseConfig(object): 
    DEBUG = False 
    TESTING = False 
    ... 


class DevelopmentConfig(BaseConfig): 
    DEBUG = True 
    TESTING = True 
    ... 


class TestingConfig(BaseConfig): 
    DEBUG = False 
    TESTING = True 
    ... 

config = { 
    'development': 'app.config.DevelopmentConfig', 
    'testing': 'app.config.TestingConfig', 
    'default': 'app.config.BaseConfig' 
} 


def configure_app(app): 
    config_name = os.environ.get('FLASK_CONFIGURATION', 'default') 
    app.config.from_object(config[config_name]) 
    app.config.from_pyfile('config.py', silent=True) 
    apikey = os.environ.get('TOKEN', None) 
    if apikey: 
     app.config['APIKEY'] = apikey 

我打電話,我__init__.pyconfigure_app之後我創建弗萊克對象。

app = Flask(__name__) 
configure_app(app) 

config.py:

APIKEY = 'filesecret' 
HOOKS = {'testpush': 'scripts/test.sh'} 

我想要做的是能夠使用py.test的各種配置選項單元測試。我目前的嘗試是嘗試並使用mock_open,但配置會繼續讀取文件中的內容而不是跳過它。

class TestConfig: 

    def setup(self): 
     self.app = app.app 
     self.app.config['TESTING'] = True 

    def test_default(self, mocker): 
     m = mocker.mock_open(read_data='') 
     configure_app(self.app) 
     assert self.app.config['APIKEY'] == "secret" 

結果測試:

def test_default(self, mocker): 
     m = mocker.mock_open(read_data='') 
     configure_app(self.app) 
>  assert self.app.config['APIKEY'] == "secret" 
E  assert 'filesecret' == 'secret' 

我不知道如何做到這一點的時候,我不知道瓶中的內部。有沒有辦法僞造/模擬文件?我希望能夠編寫存在的配置文件的各種測試用例,不存在,並設置環境變量以確保優先級保持不變。

回答

0

所以我就這一切都錯了。我查看了Flask的源代碼,看到他們如何測試他們的配置函數,並且他們只是用自己的環境變量實例化了一個新的Flask對象。

Flask project test_config.py

使用the context manager found on this stackoverflow question(目前contextlib底部的答案)來設置我的環境變量我得到了這一切偉大的工作。

最終測試:

@pytest.mark.parametrize(
    'envtoken, flask_conf, test_path, apikey, debug, testing', [ 
     ('', 'default', 'missing', 'secret', False, False), 
     ('', 'development', 'missing', 'secret', True, True), 
     ('', 'testing', 'missing', 'secret', False, True), 
     ('', 'default', '../tests/data', 'filesecret', False, False), 
     ('envsecret', 'default', '../tests/data/', 'envsecret', False, False)]) 
def test_config_app(envtoken, flask_conf, test_path, apikey, debug, testing): 
    with set_env(DOCKERHOOK_TOKEN=envtoken, FLASK_CONFIGURATION=flask_conf): 
     # app = Flask(__name__) 
     base_path = get_app_base_path() 
     instance_path = os.path.join(base_path, test_path) 

     app = Flask(__name__, 
        instance_path=instance_path, 
        instance_relative_config=True) 

     configure_app(app) 

     assert app.config['APIKEY'] == apikey 
     assert app.config['DEBUG'] == debug 
     assert app.config['TESTING'] == testing 
相關問題