我有以下脚本:
(1) 在utils.database_helper.py
:
def get_database_connection(db_profile):
conn_string = config_parser.read_config(section=db_profile)['oracle_conn_str']
engine = sqlalchemy.create_engine(conn_string)
if engine:
return engine
db1 = get_database_connection(db_profile_1)
db2 = get_database_connection(db_profile_2)
这里,在database_helper.py
两个 db 变量中都是使用原始函数来获取 Oracle 连接的。现在:
(2) 在conftest.py
:
from sqlalchemy import create_engine
@pytest.fixture(autouse=True)
engine = create_engine('...[work dir]\test\test.db')
def setup_database(monkeypatch):
monkeypatch.setattr('utils.database_helper.get_database_connection', engine)
monkeypatch.setattr('utils.database_helper.db1', engine)
monkeypatch.setattr('utils.database_helper.db2', engine)
yield engine
有test.py
所以它读取第setup_database
一个,带有一个可以在database_helper
某处导入的加载器。
测试脚本假设覆盖get_database_connection
函数,然后db1
可以db2
基于新替换的函数工作。
测试通过上述设置。但是,如果我去:
monkeypatch.setattr('utils.database_helper.get_database_connection', engine)
# monkeypatch.setattr('utils.database_helper.db1', engine)
# monkeypatch.setattr('utils.database_helper.db2', engine)
会出现错误,显示:
cx_Oracle.DatabaseError: ORA-00904: "IFNULL": invalid identifier
我检查了日志,似乎第一次运行,database_helper.py
然后被分配了 Oracle 连接。然后,即使monkeypatch完成了函数模拟,当再次调用它们时,它们也不会应用假设要覆盖的新模拟函数,而是它们仍然跟随Oracle连接而不是测试连接。db1
db2
db1
db2
get_database_connection
有没有办法只编辑conftest.py
来解决?