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,
...
}