You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jest测试中获取window/global对象以访问VRMaker?

在Jest测试中访问window/global对象中的VRMaker

问题根源

你当前的问题主要出在两个点上:

  1. Jest测试环境不会自动模拟浏览器的window.onload触发,所以你的回调函数根本没机会执行;
  2. 测试代码的执行时机和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:50