使用 jest、jsdom 和 rewire 时出现 ReferenceError“导航器未定义”

And*_*s_D 6 javascript jsdom jestjs rewire

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

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

这是显示错误的最小设置。我不使用笑话配置,因为它默认为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.
Run Code Online (Sandbox Code Playgroud)

索引.js

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

module.exports = {
  doSomething: () => {}
}
Run Code Online (Sandbox Code Playgroud)

索引.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');
  })
})
Run Code Online (Sandbox Code Playgroud)

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

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

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