2017-12-30 73 views
0

Flask 응용 프로그램의 설정 파일에 대한 테스트를 작성하고 있습니다. 시스템에 설정된 env 변수가 테스트의 결과에 영향을 미치지 않도록하려면 예측 가능한 테스트 결과를 생성하기 위해 pytest의 monkeypatch를 사용하고 있습니다.env 변수를 변경 한 후 조명기에서 객체를 올바르게 가져 오는 방법

env 변수가 설정되지 않은 조명기와 '가짜'설정의 조명기를 사용하여 '깨끗한'상태로 구성 파일을 테스트하고 있습니다. 테스트를 실행하기 전에 monkeypatch 변수를 설정하도록합니다.

두 조명기 모두 env 변수를 설정 한 다음 config 객체를 가져 와서 테스트 기능에 전달합니다.

구성 객체가 조명기 내에서가 아니라 문서의 헤드에로드되면 두 조명기 모두 실제 시스템 환경 변수를 기반으로 한 버전을 사용합니다.

두 번째 조명기는 config 객체를 가져 오지 않지만 cleanConfig 조명기로 생성 된 조명기를 다시 사용하는 것처럼 보입니다. 조명기가 설정 객체를 다시 가져 오게하려면 어떻게해야합니까?

는 test_config.py :

import pytest 
from config import config 

class TestConfigSettings(object): 

@pytest.fixture(scope='function') 
def cleanConfig(config_name, monkeypatch): 
    def makeCleanConfig(config_name): 

     monkeypatch.delenv('SECRET_KEY', raising=False) 
     monkeypatch.delenv('DEV_DATABASE_URL', raising=False) 

     from config import config 
     configObject = config[config_name] 

     return configObject 
    return makeCleanConfig 


@pytest.fixture(scope='function') 
def fakeEnvConfig(config_name, monkeypatch): 
    def makeFakeEnvConfig(config_name): 

     monkeypatch.setenv('SECRET_KEY', 'fake difficult string') 
     monkeypatch.setenv('DEV_DATABASE_URL', 'postgresql://fake:5432/fakeDevUrl') 

     from config import config 
     configObject = config[config_name] 

     return configObject 
    return makeFakeEnvConfig 


def test_configObject_withDevelopmentConfig_containsCorrectSettings(self, cleanConfig): 
    configObject = cleanConfig('development') 

    assert configObject.SECRET_KEY == 'hard to guess string' 
    assert configObject.DEBUG == True 
    assert configObject.SQLALCHEMY_DATABASE_URI == None 

def test_configObject_withDevelopmentConfigAndEnvSet_copiesEnvSettings(self, fakeEnvConfig): 
    configObject = fakeEnvConfig('development') 

    assert configObject.SECRET_KEY == 'fake difficult string' 
    assert configObject.SQLALCHEMY_DATABASE_URI == 'postgresql://fake:5432/fakeDevUrl' 

Config.py :

class Config: 
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string' 

class DevelopmentConfig(Config): 
    DEBUG = True 
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') 

config = { 
    'default': DevelopmentConfig, 
    'development': DevelopmentConfig, 
    ... 
} 

답변

0

나는 결국 내 문제에 대한 해결책을 발견했다. reload() 함수를 사용하여 내용 (이 경우로드 된 env 변수)을 변경 한 후 모듈을 다시 가져올 수 있습니다. reload() 객체는 모듈에서만 작동하기 때문에 이전에 가져온 config 사전 대신 config 모듈로 가져 오기를 변경해야만 사용할 수있었습니다. 새 코드 :

import pytest 
from importlib import reload 
import config 

class TestConfigSettings(object): 

@pytest.fixture(scope='function') 
def cleanConfig(config_name, monkeypatch): 
    def makeCleanConfig(config_name): 

     monkeypatch.delenv('SECRET_KEY', raising=False) 
     monkeypatch.delenv('DEV_DATABASE_URL', raising=False) 

     reload(config) 
     configObject = config.config[config_name] 

     return configObject 
    return makeCleanConfig 

@pytest.fixture(scope='function') 
def fakeEnvConfig(config_name, monkeypatch): 
    def makeFakeEnvConfig(config_name): 

     monkeypatch.setenv('SECRET_KEY', 'fake difficult string') 
     monkeypatch.setenv('DEV_DATABASE_URL', 'postgresql://fake:5432/fakeDevUrl') 

     reload(config) 
     configObject = config.config[config_name] 

     return configObject 
    return makeFakeEnvConfig