使用jsdom,mocha,es2016设置jQuery测试

时间:2016-09-18 18:11:52

标签: jquery mocha jsdom

我试图使用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()而无需进行更改。

大多数设置配置来自http://airbnb.io/enzyme/docs/guides/jsdom.html

1 个答案:

答案 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);