gpt4 book ai didi

python-3.x - 为什么我的 pytest 测试会在删除 SQLAlchemy 数据库之前挂起?

转载 作者:行者123 更新时间:2023-12-05 02:38:59 26 4
gpt4 key购买 nike

这是我的 conftest.py(为简洁起见删除了一些代码)

from trip_planner import create_app, db as _db
from trip_planner.models import User
from test import TestConfig, test_instance_dir


@pytest.fixture(scope='session', autouse=True)
def app(session_mocker: pytest_mock.MockerFixture):
static_folder = mkdtemp(prefix='static')
_app = create_app(TestConfig(), instance_path=test_instance_dir,
static_folder=static_folder)
ctx = _app.app_context()
ctx.push()
session_mocker.patch('trip_planner.assets.manifest',
new=defaultdict(str))

yield _app

ctx.pop()
os.rmdir(static_folder)


@pytest.fixture(scope='session')
def db(app):
_db.create_all()
seed_db(_db)

yield _db

_db.drop_all()


def seed_db(db) -> User:
sessionmaker = db.create_session({'autocommit': False})
session = sessionmaker()

user = User(username='username',
password_digest=bcrypt.hash('password'))
session.add(user)

session.commit()
session.close()
return user


@pytest.fixture(scope='function')
def db_session(db):
session = db.create_scoped_session(options=dict(
autocommit=False, autoflush=False
))

db.session = session
with session.begin_nested():
yield session

session.rollback()
session.remove()


@pytest.fixture(scope='function')
def app_client(app):
with app.test_client() as c:
yield c


@pytest.fixture(scope='function')
def session_user(db_session, app_client) -> int:
user_id, = db_session.query(User.id).filter_by(username='username').one()
with app_client.session_transaction() as sess:
sess['user_id'] = user_id
return user_id

当我的测试通过时,pytest 挂起。我只能用 killall 来阻止它。检查测试数据库表明这些关系实际上并没有被删除。

我该如何补救?

最佳答案

显然,这是 PostgreSQL 的一个众所周知的问题,这里是 discussion.

我解决它的方法是在删除所有表之前添加 _db.close_all_sessions():

@pytest.fixture(scope='session')
def db(app):
_db.create_all()
seed_db(_db)

yield _db

_db.close_all_sessions()
_db.drop_all()

关于python-3.x - 为什么我的 pytest 测试会在删除 SQLAlchemy 数据库之前挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69307554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com