Mocha:似乎无法从 mocha 测试中调用使用 jQuery 的模块方法
Mocha: Can't seem to call module's methods that use jQuery from inside mocha tests
因此,我正在使用 Mocha/Chai 进行一些测试,而我正在测试的项目取决于 jQuery。我正在使用 jsdom 来帮助解决这个问题。正如您从下面的代码中看到的那样 我在 mocha 测试本身 中使用 jQuery 没有问题。我似乎无法定位的只是调用使用 jQuery 的代码。
当 运行 在浏览器中使用时,jQuery 在包含 ACE_GA 模块之前包含在脚本标记中,因此 jQuery 可以在那里完全工作。
在检查下面的代码片段时,done() 函数中有两行带有注释。第一行有注释,只是调用了 ACE_GA 模块中的代码,它不起作用。第二行有注释,正在从 ACE_GA 模块(我试图在第一行中调用)内部重新创建一些代码,它工作得很好。
明确地说,行得通的行:
var productItems = jQuery("[data-" + ACE_GA.VALID_PRODUCT_FIELDS.prefix + "]");
只是从我试图调用的模块方法中复制一行,这给我带来了问题:
var productItems = ACE_GA.HELPERS.validateOptions(ACE_GA.VALID_PRODUCT_FIELDS.prefix);
我需要做什么才能简单地调用客户端 library/module 并让 jQuery 使用它,而不是从模块到 mocha 的 copying/pasting 代码片段测试?
var chai = require("chai");
var jsdom = require("jsdom");
var jQuery = require("jquery");
var fs = require("fs");
var ACE_GA = require("../main");
var bodyContent = fs.readFileSync(__dirname + "/../test/test.html", "utf8", "r");
global.document = jsdom.jsdom(bodyContent);
global.window = document.defaultView;
global.jQuery = jQuery;
describe("ACE_GA.HELPERS.validateOptions", function() {
it("should select all items with a data-attribute of 'ace-ga-{something}'", function(done) {
jsdom.env({
html: bodyContent,
src: jQuery,
scripts: "http://www.asite.com/path/to/default/js/jquery-1.11.3.min.js",
userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
done: function(err, window) {
console.log("err", err);
var jQuery = window.jQuery;
//var productItems = ACE_GA.HELPERS.validateOptions(ACE_GA.VALID_PRODUCT_FIELDS.prefix);
/** ^ that won't work and says jQuery requires a window with a document */
var productItems = jQuery("[data-" + ACE_GA.VALID_PRODUCT_FIELDS.prefix + "]");
/** ^ that works just fine and is copy/pasted from the non working method I'm trying to call above */
chai.expect(productItems.length).to.equal(4);
done();
}
});
});
});
供任何人参考,这是我遇到的失败错误的确切输出
1) ACE_GA.HELPERS.validateOptions should select all items with a data-attribute of 'ace-ga-{something}':
Uncaught Error: jQuery requires a window with a document
at module.exports (C:\Path\To\Project\dev-files\node_modules\jquery\dist\jquery.js:29:12)
at Object.validateOptions (main.js:144:15)
at Object.done (test\gaecTest.js:89:39)
at process.nextTick (C:\Path\To\Project\dev-files\node_modules\jsdom\lib\jsdom.js:320:18)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
据我所知,在包含的模块本身 (ACE_GA) 中,它在 jQuery 按照我希望的方式工作时遇到问题jQuery() 在 mocha 中是可以的,但是在 mocha 中定义 jQuery() 然后从 ACE_GA 模块中调用它是不一样的)。
如前所述,当在浏览器中 运行 时,我能够 define/include jQuery before 包括 ACE_GA 模块。
我试图在这里做一些类似的事情,只是在浏览器中没有 运行 它,而是 运行 从带有 mocha 的节点。
你 运行 遇到麻烦的直接原因是你没有正确初始化 jQuery 直接在节点中加载的实例(与你在 jQuery 中加载的实例相反=11=]实例)。
当您执行 require('jquery')
时,jQuery 会检查全局范围内是否存在 document
。如果是这样,它将自身安装在全局范围内。在浏览器中,结果是它将自己安装在 window
上,如 $
和 jQuery
。在Node.js中,全局作用域默认没有document
。您显示的代码也是如此。当没有定义 document
时,你从 require('jquery')
得到的是一个 factory,你可以从中构建一个 jQuery 实例。您必须将 Window
实例传递给该工厂。
您可以将初始代码更改为:
var chai = require("chai");
var jsdom = require("jsdom");
var makeJQ = require("jquery"); // Load the factory.
var fs = require("fs");
var bodyContent = fs.readFileSync(__dirname + "/../test/test.html", "utf8", "r");
global.document = jsdom.jsdom(bodyContent);
global.window = document.defaultView;
global.$ = global.jQuery = makeJQ(window); // Actually make a jQuery instance.
// Load this after, since it depends on jQuery being in the global space.
var ACE_GA = require("../main");
然后您应该放弃在测试中使用 jsdom 创建的第二个 window,而只使用在测试文件开头设置的那个。您可以通过在测试之间清理 DOM 树来在测试之间重复使用它。
因此,我正在使用 Mocha/Chai 进行一些测试,而我正在测试的项目取决于 jQuery。我正在使用 jsdom 来帮助解决这个问题。正如您从下面的代码中看到的那样 我在 mocha 测试本身 中使用 jQuery 没有问题。我似乎无法定位的只是调用使用 jQuery 的代码。
当 运行 在浏览器中使用时,jQuery 在包含 ACE_GA 模块之前包含在脚本标记中,因此 jQuery 可以在那里完全工作。
在检查下面的代码片段时,done() 函数中有两行带有注释。第一行有注释,只是调用了 ACE_GA 模块中的代码,它不起作用。第二行有注释,正在从 ACE_GA 模块(我试图在第一行中调用)内部重新创建一些代码,它工作得很好。
明确地说,行得通的行:
var productItems = jQuery("[data-" + ACE_GA.VALID_PRODUCT_FIELDS.prefix + "]");
只是从我试图调用的模块方法中复制一行,这给我带来了问题:
var productItems = ACE_GA.HELPERS.validateOptions(ACE_GA.VALID_PRODUCT_FIELDS.prefix);
我需要做什么才能简单地调用客户端 library/module 并让 jQuery 使用它,而不是从模块到 mocha 的 copying/pasting 代码片段测试?
var chai = require("chai");
var jsdom = require("jsdom");
var jQuery = require("jquery");
var fs = require("fs");
var ACE_GA = require("../main");
var bodyContent = fs.readFileSync(__dirname + "/../test/test.html", "utf8", "r");
global.document = jsdom.jsdom(bodyContent);
global.window = document.defaultView;
global.jQuery = jQuery;
describe("ACE_GA.HELPERS.validateOptions", function() {
it("should select all items with a data-attribute of 'ace-ga-{something}'", function(done) {
jsdom.env({
html: bodyContent,
src: jQuery,
scripts: "http://www.asite.com/path/to/default/js/jquery-1.11.3.min.js",
userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
done: function(err, window) {
console.log("err", err);
var jQuery = window.jQuery;
//var productItems = ACE_GA.HELPERS.validateOptions(ACE_GA.VALID_PRODUCT_FIELDS.prefix);
/** ^ that won't work and says jQuery requires a window with a document */
var productItems = jQuery("[data-" + ACE_GA.VALID_PRODUCT_FIELDS.prefix + "]");
/** ^ that works just fine and is copy/pasted from the non working method I'm trying to call above */
chai.expect(productItems.length).to.equal(4);
done();
}
});
});
});
供任何人参考,这是我遇到的失败错误的确切输出
1) ACE_GA.HELPERS.validateOptions should select all items with a data-attribute of 'ace-ga-{something}':
Uncaught Error: jQuery requires a window with a document
at module.exports (C:\Path\To\Project\dev-files\node_modules\jquery\dist\jquery.js:29:12)
at Object.validateOptions (main.js:144:15)
at Object.done (test\gaecTest.js:89:39)
at process.nextTick (C:\Path\To\Project\dev-files\node_modules\jsdom\lib\jsdom.js:320:18)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
据我所知,在包含的模块本身 (ACE_GA) 中,它在 jQuery 按照我希望的方式工作时遇到问题jQuery() 在 mocha 中是可以的,但是在 mocha 中定义 jQuery() 然后从 ACE_GA 模块中调用它是不一样的)。
如前所述,当在浏览器中 运行 时,我能够 define/include jQuery before 包括 ACE_GA 模块。
我试图在这里做一些类似的事情,只是在浏览器中没有 运行 它,而是 运行 从带有 mocha 的节点。
你 运行 遇到麻烦的直接原因是你没有正确初始化 jQuery 直接在节点中加载的实例(与你在 jQuery 中加载的实例相反=11=]实例)。
当您执行 require('jquery')
时,jQuery 会检查全局范围内是否存在 document
。如果是这样,它将自身安装在全局范围内。在浏览器中,结果是它将自己安装在 window
上,如 $
和 jQuery
。在Node.js中,全局作用域默认没有document
。您显示的代码也是如此。当没有定义 document
时,你从 require('jquery')
得到的是一个 factory,你可以从中构建一个 jQuery 实例。您必须将 Window
实例传递给该工厂。
您可以将初始代码更改为:
var chai = require("chai");
var jsdom = require("jsdom");
var makeJQ = require("jquery"); // Load the factory.
var fs = require("fs");
var bodyContent = fs.readFileSync(__dirname + "/../test/test.html", "utf8", "r");
global.document = jsdom.jsdom(bodyContent);
global.window = document.defaultView;
global.$ = global.jQuery = makeJQ(window); // Actually make a jQuery instance.
// Load this after, since it depends on jQuery being in the global space.
var ACE_GA = require("../main");
然后您应该放弃在测试中使用 jsdom 创建的第二个 window,而只使用在测试文件开头设置的那个。您可以通过在测试之间清理 DOM 树来在测试之间重复使用它。