gpt4 book ai didi

python-3.x - 使用pytest-mock在python中使用SQLalchemy模拟数据库调用

转载 作者:行者123 更新时间:2023-12-05 03:44:49 26 4
gpt4 key购买 nike

我有这个函数,它使用 SQLalchemy ORM 调用数据库。

def get_cust_id(self,_session_id):
cust_id: str = self.sqlalchemy_orm.get_customer_id_sqlalchemy(_session_id)

if cust_id is None:
return _session_id
return cust_id


def get_customer_id_sqlalchemy(self, _session_id: int) -> str:
try:
if self.session is None:
self.session = self._connection.get_session()

_res_id = self.session.query(Users).with_entities(Users.cust_id).filter(
Users.age > 20).order_by(Users.id.desc()).one_or_none()

if _res_id is None:
return _res_id
else:
return __res_id[0]

finally:
if not self.persistent_connection:
self.session.close()

我想对 get_cust_id() 和 mock 数据库调用进行单元测试,我应该如何使用 pytest 和 mock 进行测试?

最佳答案

无需对您的类了解太多,模拟 get_cust_id 非常简单。我们看到它调用了另一个对象的某些属性,所以我们需要做的就是模拟 self.sqlalchemy_orm。最后一部分是检查此处存在的两个逻辑分支,即 cust_id 何时为 None 以及何时不是。要使用相同的测试同时检查这两种情况,我们可以使用 pytest.mark.parametrize .

import pytest

from unittest.mock import MagicMock

@pytest.mark.parametrize("val,expected", [(None, 3), (5, 5)])
def test_get_cust_id(val, expected):
db = MyDB()
mock_session = MagicMock()

mock_session.configure_mock(
**{
"get_customer_id_sqlalchemy.return_value": val
}
)
setattr(db, "sqlalchemy_orm", mock_session)
id_ = db.get_cust_id(expected)

assert id_ == expected

运行时产生以下结果。

=========================================== test session starts ===========================================
platform darwin -- Python 3.9.1, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
cachedir: .pytest_cache
collected 2 items

test_db.py::test_get_cust_id[None-3] PASSED [ 50%]
test_db.py::test_get_cust_id[5-5] PASSED [100%]

============================================ 2 passed in 0.06s ============================================

关于python-3.x - 使用pytest-mock在python中使用SQLalchemy模拟数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66228078/

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