全局模拟和模块模拟
- vi.mock 处理 ES 模块导入(现代标准用法)
- global 模拟处理全局调用(兼容性考虑)
两种模拟方式的区别
1. 全局模拟 (global)
// 模拟 uni-app 生命周期
;(global as any).onLaunch = vi.fn()
;(global as any).onShow = vi.fn()
;(global as any).onHide = vi.fn()
这种方式是在 全局对象 上添加这些函数,主要用于:
- 模拟 uni-app 运行时环境中的全局生命周期函数
- 兼容一些直接调用全局生命周期函数的代码
2. 模块模拟 (vi.mock)
这种方式是模拟 ES 模块的导入 ,主要用于:
- 模拟从 @dcloudio/uni-app 模块导入的生命周期钩子
- 这是现代 uni-app 项目中的标准用法
为什么两种都需要?
从搜索结果可以看到,在实际的组件和页面中,生命周期钩子是这样使用的:
当测试代码中遇到这种导入语句时:
- vi.mock 负责拦截 import { onShow } from '@dcloudio/uni-app' 这种模块导入
- global 模拟 负责处理可能存在的全局调用方式
实际应用场景
- 模块导入场景 (主要): → 需要 vi.mock('@dcloudio/uni-app', ...)
- 全局调用场景 (兼容): → 需要 (global as any).onShow = vi.fn()
总结
这两种模拟方式是 互补的 ,不是重复的:
- vi.mock 处理 ES 模块导入(现代标准用法)
- global 模拟处理全局调用(兼容性考虑) 这样的设计确保了测试环境能够完全模拟 uni-app 的运行环境,无论组件使用哪种方式调用生命周期钩子都能正常工作。