首页 > 解决方案 > 如何测试检查窗口的脚本是否用开玩笑未定义?

问题描述

使用导入的类,我通常会jest.mock('foo.js')添加我的实现......但它不适用于 window 对象。即使我可以在我的测试中正确地模拟它,当我运行脚本时,窗口也不会被模拟。我仍然希望能够在浏览器环境中运行此测试,那么我将如何在脚本环境与测试环境中模拟窗口对象?

下面是我一直在使用的当前方法的人为代码......

foo.js

export default class Foo {
  validate() {
    if (window === undefined) {
      throw new Error('must be run in a browser')
    }
  }
}

foo.test.js

import Foo from 'foo.js'

it('should throw an error if not in a browser', () => {
  const foo = new Foo()
  const validateError = () => {
    foo.validate()
  }

  let windowSpy = jest.spyOn(global, 'window', 'get')
  windowSpy.mockImplementation(() => undefined)

  // this passes
  expect(window).toBeUndefined()

  // this fails
  expect(validateError).toThrow()
})

标签: javascriptnode.jsjestjsmocking

解决方案


你可以delete global.window试一试(仅在 repl.it 上测试过)

const Foo = require('./Foo');

describe('Foo', () => {
  const foo = new Foo()

  describe('if there is NO global window', () => {
    beforeAll(() => {
      delete global.window
    })

    it('should throw an error', () => {
      expect(() => foo.validate()).toThrow()
    })
  })

  describe('if there IS a global window', () => {
    beforeAll(() => {
      global.window = {}
    })
    it('should not throw an error', () => {
      expect(() => foo.validate()).not.toThrow()
    })
  })
})

工作示例


推荐阅读