我被一个开玩笑的测试设置困住了。我想测试一些客户端代码,一个电子预加载脚本,准确地说,我想使用 rewire 来测试未导出的方法。
被测脚本依赖于另一个访问window.navigator
. 我可以测试脚本,但是当我使用它时,它在第一行出现错误require
而失败。ReferenceError: navigator is not defined
dom.js
rewire
这是显示错误的最小设置。我不使用 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.navigator
或global.navigator
)。
非常感谢任何帮助,通常我会在谷歌上找到几乎所有问题的解决方案,但这次我迷路了。
要重现,请将三个文件复制到一个文件夹中,然后执行npm init
, npm install jest rewire
, npx jest
.