当函数以 `from module import func` 方式被导入时,需在**使用该函数的模块作用域内**进行 patch(如 `@patch(“entry.read_sql”)`),而非原始定义模块,否则 mock 不生效。
在 Python 单元测试(尤其是使用 unittest.mock.patch)中,mock 的目标必须是对象在运行时实际被引用的位置,而非其原始定义位置。这是初学者最容易混淆的关键点。
以你的代码为例:
# entry.py
from sql_services import read_sql # ← 此处将 read_sql 绑定为 entry 模块的局部名称
def foo():
df = read_sql("SELECT * FROM schema.table") # ← 实际调用的是 entry.read_sql!
return df
虽然 read_sql 定义在 sql_services 中,但 foo() 内部访问的是 entry 模块的全局变量 read_sql —— 这是 Python 导入机制决定的:from … import 会在当前命名空间创建一个新引用。因此,mock 必须指向 “entry.read_sql”,而不是 “sql_services.read_sql”。
✅ 正确的测试写法如下:
立即学习“Python免费学习笔记(深入)”;