如何在 pytest 中绕过 joblib 缓存并直接调用原始函数

在 pytest 单元测试中,可通过访问 `joblib` 缓存函数的 `.func` 属性跳过缓存,直接执行原始逻辑,无需 mock 或修改全局配置。

当使用 joblib.Memory 装饰函数(如 @memory.cache)时,装饰器返回的是一个 MemorizedFunc 实例,它不仅封装了缓存逻辑,还保留了原始函数的引用——即 .func 属性。这是 joblib 官方支持的、轻量且可靠的测试绕过方式,相比 mock Memory 或临时禁用缓存更安全、更简洁。

例如,以下代码定义了一个带缓存的平方函数:

from joblib impo

rt Memory memory = Memory(location="cache") @memory.cache def func(a): print("Executing original function!") # 可用于验证是否真正执行 return a ** 2

在测试中,直接调用 func.func(2) 即可绕过所有缓存机制,确保每次测试都触发实际计算:

def test_func():
    assert func.func(2) == 4  # ✅ 调用原始函数,不读/写缓存
    assert func.func(3) == 9  # ✅ 每次都是新鲜执行

⚠️ 注意事项:

  • 不要 mock joblib.Memory 或 memory.cache —— 这可能干扰其他测试或导致难以调试的副作用;
  • .func 是公开稳定接口(见 joblib 文档),适用于所有 @memory.cache 装饰的函数;
  • 若需完全禁用缓存(如集成测试阶段),可将 Memory 初始化为 Memory(location=None, verbose=0),但单元测试中推荐优先使用 .func 方式,语义更明确、开销更低。

总结:对于单元测试,func.func(...) 是最直接、最可靠、最符合测试隔离原则的解决方案——它让你精准控制执行路径,既保持代码简洁,又确保测试真实性和可重复性。