如何在以下Jest测试中获得窗口/全局?

时间:2018-04-11 02:19:55

标签: 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(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)

为什么会这样以及如何解决? (我尝试用window替换global但我收到同样的错误。)

2 个答案:

答案 0 :(得分:1)

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

import './src'

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

看看是否有效。

答案 1 :(得分:1)

开玩笑中没有windowwindow.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()
  })
})