'最大调用堆栈大小超过'使用zombie.js加载jQuery页面

时间:2014-10-10 15:33:26

标签: node.js zombie.js

大约4天,我在node.js项目上的大多数功能测试套件都失败了,无论是在Linux上的CI还是在OS X上的本地。我不认为这是由于我的代码库中的任何变化,如我可以回滚到git repo的早期状态,看看过去通过的测试现在同样失败了。它在不同平台上失败的事实使我认为它不太可能是一个特别的本地环境变化。

我怀疑它可能是依赖树中某处的问题,而且很可能是zombie.js使用的其中一个软件包,因为我的应用似乎仍能正常工作。但是,当测试上次工作时,我没有记录树中所有软件包的版本。

我已经缩减到以下测试用例:

so_test.js

"use strict";

var zombie = require('zombie');
var browser = zombie.create({ debug: true });
var assert = require('assert');

describe('Stack Overflow', function() {
  it('should be alive', function(done) {
    browser.visit('http://stackoverflow.com/')
      .then(function() {
        browser.dump();

        assert.equal(browser.location.pathname, '/', 'It is not the SO home page.');
        assert.ok(browser.success, 'It did not load successfully.');
      })
      .then(done, done);
  });
});

对我来说失败如下:

$ mocha -R spec test/functional/stack_overflow.js 


  Stack Overflow
Zombie: Opened window http://stackoverflow.com/ 
Zombie: GET http://stackoverflow.com/ => 200
Zombie: Loaded document http://stackoverflow.com/
Zombie: GET http://cdn.sstatic.net/Js/stub.en.js?v=26cc3a09b135 => 200
Zombie: GET http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js => 200
Maximum call stack size exceeded undefined
$ is not defined ReferenceError: $ is not defined
    at <anonymous>:1:8168
    at Contextify.sandbox.run (/Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/node_modules/contextify/lib/contextify.js:12:24)
    at DOMWindow.window._evaluate (/Users/nanoamp/src/p/node_modules/zombie/lib/zombie/window.js:188:25)
    at Object.HTML.languageProcessors.javascript (/Users/nanoamp/src/p/node_modules/zombie/lib/zombie/scripts.js:23:21)
    at define.proto._eval (/Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:1480:47)
    at loaded (/Users/nanoamp/src/p/node_modules/zombie/lib/zombie/scripts.js:74:23)
    at /Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:76:20
    at Object.item.check (/Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:345:11)
    at Object.item.check (/Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:348:23)
    at /Users/nanoamp/src/p/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:363:12

... similar deleted for brevity ...

Zombie: Event loop is empty
    1) should be alive


  0 passing (2s)
  1 failing

  1) Stack Overflow should be alive:
     Maximum call stack size exceeded

如果我将网址更改为 www.google.com (不使用jQuery),则会通过该网址。如果我将zombie.js更改为2.0.0-alpha31(之前正在工作)和2.0.4之间的另一个版本,它没有任何区别。在我的原始代码中,我可以更改1.7和1.11之间自由加载的jQuery版本而没有任何好处。虽然jQuery似乎是一个触发器,但我不知道它是否是该库的特定内容,或者只是它与DOM挂钩的事实。

我还将测试用例放在Runnable上:http://runnable.com/VDf4OLzyU64cSSuz/zombie-js-test-loading-page-with-jquery-for-node-js-and-mocha(虽然在撰写本文时似乎有点不稳定)。

任何人都可以建议如何解决此问题,或者如果没有这样做,如何更好地调查?

1 个答案:

答案 0 :(得分:2)

它现在可以与zombie 2.0.7一起使用。

我终于设法从日志中检索了我之前工作版本的依赖关系树,这使我能够找到问题的具体来源:

zombie@2.0.0-alpha31 <-- last working version
- jsdom@0.8.11
-- cssstyle@0.2.14

zombie@2.0.0-alpha31 <-- unchanged top-level package.json
- jsdom@0.8.11           routine `npm install` must've updated deeper cssstyle
-- cssstyle@0.2.18

zombie 2.0.4         <-- tried updating zombie, still failing
- jsdom@1.0.0-pre.7
-- cssstyle@0.2.18
-- parse5@1.0.1

zombie 2.0.7         <-- working today
- jsdom@1.0.2
-- cssstyle@0.2.18
-- cssstyle-browserify@0.2.7
-- parse5@1.1.4

如果我重新创建了确切的初始工作包树并执行了:

cd node_modules/zombie/node_modules/jsdom && npm install cssstyle@0.2.18
然后它会停止工作。因此,我将问题归结为zombie.js的jsdom依赖关系的cssstyle依赖项中引入的不兼容性。对于node.js模块模式来说,从依赖地狱中拯救我们:)