
在 pytest 单元测试中,可通过访问 `joblib` 缓存函数的 `.func` 属性跳过缓存,直接执行原始逻辑,无需 mock 或修改全局配置。
当使用 joblib.Memory 装饰函数(如 @memory.cache)时,装饰器返回的是一个 MemorizedFunc 实例,它不仅封装了缓存逻辑,还保留了原始函数的引用——即 .func 属性。这是 joblib 官方支持的、轻量且可靠的测试绕过方式,相比 mock Memory 或临时禁用缓存更安全、更简洁。
例如,以下代码定义了一个带缓存的平方函数:
from joblib import 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(...) 是最直接、最可靠、最符合测试隔离原则的解决方案——它让你精准控制执行路径,既保持代码简洁,又确保测试真实性和可重复性。










