我试图使用sinon的假服务器在mocha测试中模拟jQuery调用。但测试总是给出一个错误,如jQuery.post不是一个函数或jQuery是未定义的。我不清楚如何使用es6 / es2015语法将jQuery导入jsdom。
这是test / setup.js的内容(安装了jquery npm包)
import { jsdom } from 'jsdom';
import jQuery from 'jquery';
var exposedProperties = ['window', 'navigator', 'document'];
global.document = jsdom('');
global.window = document.defaultView
Object.keys(document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = document.defaultView[property];
}
});
global.jQuery = jQuery;
global.navigator = {
userAgent: 'node.js'
};
我认为在设置修复后,我应该能够在测试中使用jQuery.post()
而无需进行更改。
答案 0 :(得分:0)
加载jQuery时,它会检测全局空间是否为窗口。如果是,则将其自身导出到jQuery
和$
窗口。如果没有,那么它作为模块值导出的是安装功能,您可以使用它在未来的窗口对象上安装jQuery。在您的原始代码中,到时间import jQuery from 'jquery';
还没有可供jQuery使用的窗口,因此您获得了一个安装函数,然后您必须使用该函数在窗口上安装jQuery。
这里有效的代码。我添加或修改的每一行都被评论。
import { jsdom } from 'jsdom';
import _jQuery from 'jquery'; // Modify this to add the underscore.
var exposedProperties = ['window', 'navigator', 'document'];
global.document = jsdom('');
global.window = document.defaultView
const jQuery = _jQuery(window); // Add this line.
Object.keys(document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = document.defaultView[property];
}
});
global.jQuery = jQuery;
global.navigator = {
userAgent: 'node.js'
};
// This should output "function".
console.log(typeof jQuery.post);