3

我被一个开玩笑的测试设置困住了。我想测试一些客户端代码,一个电子预加载脚本,准确地说,我想使用 rewire 来测试未导出的方法。

被测脚本依赖于另一个访问window.navigator. 我可以测试脚本,但是当我使用它时,它在第一行出现错误require而失败。ReferenceError: navigator is not defineddom.jsrewire

这是显示错误的最小设置。我不使用 jest 配置,因为它默认为jsdom测试环境。

dom.js

console.log('during rewire:', global.navigator)  // <-- prints undefined
console.log('The added property:', global.FOO)   // <-- prints undefined 

const userAgent = navigator.userAgent;           // <-- fails.

index.js

const myDom = require('./dom.js');

module.exports = {
  doSomething: () => {}
}

index.spec.js

const rewire = require('rewire');

describe('Basic test', () => {
  it('exports a function', () => {
    global.FOO = 'Bar'
    console.log('before rewire:', global.navigator)  // prints Navigator {}
    console.log('The added property:', global.FOO)   // prints Bar

    // const main = require('.')  // <-- works with require
    const main = rewire('.')      // <-- but fails with rewire
    expect(typeof main.doSomething).toBe('function');
  })
})

看起来好像rewire使用了不同的global,不再具有jsdom环境的(或还没有?)(如global.window.navigatorglobal.navigator)。

非常感谢任何帮助,通常我会在谷歌上找到几乎所有问题的解决方案,但这次我迷路了。

要重现,请将三个文件复制到一个文件夹中,然后执行npm init, npm install jest rewire, npx jest.

4

0 回答 0