Skip to content

全局模拟和模块模拟

  • 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 模拟 负责处理可能存在的全局调用方式

实际应用场景

  1. 模块导入场景 (主要): → 需要 vi.mock('@dcloudio/uni-app', ...)
  2. 全局调用场景 (兼容): → 需要 (global as any).onShow = vi.fn()

总结

这两种模拟方式是 互补的 ,不是重复的:

  • vi.mock 处理 ES 模块导入(现代标准用法)
  • global 模拟处理全局调用(兼容性考虑) 这样的设计确保了测试环境能够完全模拟 uni-app 的运行环境,无论组件使用哪种方式调用生命周期钩子都能正常工作。

Released under the MIT License.