0

我有以下脚本:

(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连接而不是测试连接。db1db2db1db2get_database_connection

有没有办法只编辑conftest.py来解决?

4

0 回答 0