如何在Jest测试中获取window/global对象以访问VRMaker?
在Jest测试中访问window/global对象中的VRMaker
问题根源
你当前的问题主要出在两个点上:
- Jest测试环境不会自动模拟浏览器的
window.onload触发,所以你的回调函数根本没机会执行; - 测试代码的执行时机和VRMaker挂载到window的时机没对齐,导致你在断言时拿不到目标对象。
解决方法
方法1:手动触发window.onload
既然Jest不会自动触发页面加载完成事件,那我们直接手动调用它就行,这样回调里的逻辑就能正常执行:
import '../src' test('first test', () => { let result window.onload = function () { console.log(VRMaker) result = window.VRMaker expect(result).toBeDefined() // 先确认对象存在 expect(result.getCurrentPanorama).toBeInstanceOf(Function) // 测试实例方法 } // 手动触发onload window.onload() })
方法2:直接访问window上的VRMaker
看你的源码,window.VRMaker = new VRMaker()是在模块加载时直接执行的,只要你import了../src,这个赋值操作就已经完成了,完全不需要等onload:
import '../src' test('first test', () => { // 直接从window上获取 const vrMaker = window.VRMaker expect(vrMaker).toBeDefined() // 测试generateAframe方法 vrMaker.generateAframe() // 测试getCurrentPanorama的返回值 expect(vrMaker.getCurrentPanorama()).toBeDefined() })
方法3:处理异步初始化场景(如果VRMaker依赖DOM或异步操作)
如果你的VRMaker初始化是异步的(比如依赖DOM渲染完成),可以用Jest的waitFor来等待对象挂载:
import '../src' test('first test', async () => { await waitFor(() => { expect(window.VRMaker).toBeDefined() }) // 后续测试逻辑 })
或者用done回调来标记测试完成:
import '../src' test('first test', (done) => { window.onload = function () { expect(window.VRMaker).toBeDefined() done() // 告诉Jest测试已完成 } window.onload() })
额外提示
你原来代码里的expect(result).toEqual({})是不合理的,因为VRMaker是一个类实例,不是空对象,应该用toBeDefined()或者断言它的属性/方法是否存在。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

