Mocha:似乎无法调用模块的方法,在mocha测试中使用jQuery

时间:2016-11-28 16:20:46

标签: javascript jquery mocha chai jsdom

所以,我正在使用Mocha / Chai进行一些测试,我测试的项目取决于jQuery。我正在使用jsdom来帮助解决这个问题。正如你从下面的代码中看到的那样我使用来自WITHIN的mocha测试本身的jQuery没有问题。我似乎无法找到的只是调用使用jQuery的代码。

在浏览器中运行时,在包含ACE_GA模块之前,jQuery包含在脚本标记中,因此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);

我需要做些什么才能简单地调用客户端库/模块并让jQuery使用它,而不是将代码片段从模块复制/粘贴到mocha测试中?

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的问题,因为我希望它从该上下文本身(就像定义然后在mocha中调用jQuery()一样)好吧,但在mocha中定义jQuery()然后从ACE_GA模块内部调用它不起作用)。

如前所述,在浏览器中运行时,我能够在之前定义/包含jQuery ,包括ACE_GA模块。

我尝试在此处执行类似操作,但不在浏览器中运行,而是使用mocha从节点运行。

1 个答案:

答案 0 :(得分:1)

您遇到麻烦的直接原因是您没有正确初始化直接加载到节点中的jQuery实例(与您在require('jquery')实例中加载的实例相对)

执行document时,jQuery会检查全局范围内是否有window。如果是这样,它将自己安装在全局范围内。在浏览器中,结果是它将自己安装在$上,jQuerydocument。在Node.js中,默认情况下全局范围中没有document 。您显示的代码中也是如此。如果没有定义require('jquery'),那么从Window获得的是 factory ,您可以从中构建jQuery实例。您必须将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"); 实例传递给该工厂。

您可以将初始代码更改为:

dn

然后你应该在测试中抛弃你用jsdom创建的第二个窗口,然后使用你在测试文件开头设置的那个窗口。您可以通过在测试之间清理DOM树来重用它从测试到测试。