我們通常解決這個問題的方法是使用application factory和一個配置。
這意味着你在你的項目中,看起來像這樣(從文件經修改後服用)有一個函數的地方:
def create_app(config_filename, settings_override=None):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
app.config.from_object(settings_override)
from yourapplication.model import db
db.init_app(app)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
然後(希望你使用pytest)在根目錄下的測試,你有一個conftest
文件,自動準備測試環境是這樣的:
import pytest
from your_project import create_app
class TestConfig:
SQLALCHEMY_DATABASE_URI = "postgresql://foo:[email protected]:5432/test"
SQLALCHEMY_TRACK_MODIFICATIONS = False
ANY OTHER SETTINGS...
@pytest.fixture(autouse=True)
def app(request):
app = create_app(settings_override=TestConfig)
ctx = app.app_context()
ctx.push()
def teardown():
ctx.pop()
request.addfinalizer(teardown)
return app
通常情況下,我們創建另一個夾具這也是autouse=True
,處理該數據庫的建立,沖洗和可能需要加載燈具,並且只能在需要訪問數據庫的測試中使用該燈具(集成或功能測試),這意味着我們只包含在與我們的集成測試相同的目錄中的conftest
文件中。