Javascript 如何在下面的Jest测试中获得window/global?

Javascript 如何在下面的Jest测试中获得window/global?,javascript,jestjs,Javascript,Jestjs,这是我正在学习的课程: class VRMaker extends Aframe { constructor () { super(...arguments) } } window.VRMaker = new VRMaker() export default VRMaker 我是这样使用它的: import './src' window.onload = function () { VRMaker.generateAframe() console.log(VRMak

这是我正在学习的课程:

class VRMaker extends Aframe {
  constructor () {
    super(...arguments)
  }
}

window.VRMaker = new VRMaker()
export default VRMaker
我是这样使用它的:

import './src'

window.onload = function () {
  VRMaker.generateAframe()
  console.log(VRMaker.getCurrentPanorama())
}
但是,当我尝试在Jest文件中访问VRMaker时:

import '../src'

test('first test', () => {
  let result
  window.onload = function () {
    console.log(VRMaker)
    result = VRMaker
    expect(result).toEqual({})
  }
})
我得到这个错误:

  MethodMissingError: __call, use method '__call(method, args)' in your class to catch.

> 44 |   console.log(VRMaker)
  45 |   result = VRMaker
  46 |   expect(result).toEqual({})
  47 | })

  at Object.get (node_modules/method-missing/lib/proxy.js:38:13)
  at Object.<anonymous>.test (test/helpers.test.js:44:11)
MethodMissingError:_调用,在类中使用方法“_调用(方法,参数)”来捕获。
>44 |控制台日志(VRMaker)
45 |结果=VRMaker
46 |期望(结果).toEqual({})
47 | })
在Object.get(node_modules/method missing/lib/proxy.js:38:13)
at Object..test(test/helpers.test.js:44:11)

这是为什么?如何解决?(我尝试将
窗口
替换为
全局
,但我得到了相同的错误。)

您的问题可能是
窗口。onload
,这只是一个参考。在JS window.onload的初始编译期间,会将其分配给最后一个参考点。 您可能应该将源代码放在IFFE中

import './src'

(function () {
  VRMaker.generateAframe()
  console.log(VRMaker.getCurrentPanorama())
})();

看看这是否可行。

没有
窗口,也没有
窗口。onload
只是开玩笑。如果您有一个要测试的模块,则不只是导入它并直接在其上工作

import VRMaker from './src'

describe('VRMaker', ()=>{
  it('does something', ()=>{
   frame = new VRMaker()
  })
})
如果要测试它是否已添加到窗口对象中

import VRMaker from './src'

describe('VRMaker', ()=>{
  it('does something', ()=>{
   expect(global. VRMaker).toBeDefined()
  })
})

所以IFFE应该在
窗口内。onload
?内部
测试(
?主src文件。实际上,基于window.onload的编程在我看来是错误的。您应该在测试中导入/导出并使用它,并对其进行测试。这样IFFE应该放在Jest测试文件中,对吗?但是在哪一部分?因为
src/index.js
文件是一个类声明。请尝试在Jest文件中
从“../src”导入VRMaker
,然后针对该问题进行测试