6

mymain.pyが次のようになっているとします (これは簡単な例です。私のアプリでは実際のデータベースを使用し、開発とテスト用に 2 つの異なるデータベース URI を使用しています)。

from fastapi import FastAPI
from pydantic import BaseSettings

app = FastAPI()

class Settings(BaseSettings):
    ENVIRONMENT: str

    class Config:
        env_file = ".env"
        case_sensitive = True

settings = Settings()

databases = {
    "dev": "Development",
    "test": "Testing"
}
database = databases[settings.ENVIRONMENT]

@app.get("/")
def read_root():
    return {"Environment": database}

.envある間

ENVIRONMENT=dev

ENVIRONMENT=testコードをテストし、テスト データベースを使用するように設定したいとします。私は何をすべきか?FastAPI ドキュメント ( https://fastapi.tiangolo.com/advanced/settings/#settings-and-testing ) には良い例がありますが、それは依存関係に関するものであるため、私の知る限りでは別のケースです。

私のアイデアは次のとおりです(test.py):

import pytest

from fastapi.testclient import TestClient

from main import app

@pytest.fixture(scope="session", autouse=True)
def test_config(monkeypatch):
    monkeypatch.setenv("ENVIRONMENT", "test")

@pytest.fixture(scope="session")
def client():
    return TestClient(app)

def test_root(client):
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"Environment": "Testing"}

しかし、うまくいきません。

さらに、次のエラーが表示されます。

ScopeMismatch: You tried to access the 'function' scoped fixture 'monkeypatch' with a 'session' scoped request object, involved factories
test.py:7:  def test_config(monkeypatch)
env\lib\site-packages\_pytest\monkeypatch.py:16:  def monkeypatch()

一方、pytest公式ドキュメントからは動作するはずです ( https://docs.pytest.org/en/3.0.1/monkeypatch.html#example-setting-an-environment-variable-for-the-test-session )。の最新バージョンをpytestインストールしています。

このため、特定のテスト環境変数を使用しようとしました: https://pydantic-docs.helpmanual.io/usage/settings/#field-value-priority

正直に言うと、私の唯一の本当の目的は、別のテスト構成を用意することです (Flask と同じように: https://flask.palletsprojects.com/en/1.1.x/tutorial/tests/#setup-と備品)。私は間違った方法で問題に取り組んでいますか?

4

3 に答える 3