如何让Vitest Setup Files中定义的全局变量在测试文件生效?
在Vitest中让Setup Files里的全局变量无需手动挂载window也能访问的解决方法
为什么直接用var定义的变量访问不到?
Vitest默认的setupFiles是在每个测试文件的模块作用域内执行的,你用var声明的变量只属于当前setup模块的局部作用域,测试文件作为独立模块自然访问不到。而挂载到window上相当于把变量放到了全局浏览器环境的顶层对象,所有模块都能访问。
两种解决办法:
1. 改用全局作用域的Setup文件
把你的Setup文件配置到setupFilesGlobal而不是setupFiles,这个配置项会让代码在全局作用域执行,声明的变量会成为真正的全局变量,测试文件直接就能调用:
// vitest.config.js export default { test: { setupFilesGlobal: ['./path/to/your-setup-file.js'] } }
然后在你的setup文件里直接写:
var lol = 'lol'
测试文件里就能直接用lol了。
2. 自动批量挂载变量到window
如果不想改配置,或者需要批量处理多个全局变量,可以写个简单的遍历逻辑自动挂载:
// 你的setup文件 // 把需要全局访问的变量都放到一个对象里 const globalVars = { lol: 'lol', foo: 'bar', utils: { /* 一些工具函数 */ } } // 遍历挂载到window Object.entries(globalVars).forEach(([key, value]) => { window[key] = value })
这样不用逐个写window.xxx,一次性搞定所有变量的全局访问。
注意事项
用setupFilesGlobal的时候要留意全局变量污染问题——所有测试文件共享这些变量,可能导致测试用例之间的干扰。如果有需要,可以在测试的beforeEach/afterEach钩子中清理这些全局变量。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

