使用zombie.js加载jQuery页面时,“超出最大调用堆栈大小”

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

我怀疑这可能是依赖关系树中的某个地方的问题,并且很可能是由zombie.js使用的一个包中,因为我的应用似乎仍然工作正常。 但是,在testing上次工作时,我没有logging树中所有软件包的版本。

我已经减less到以下testing用例:

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 

如果我将URL更改为www.google.com (不使用jQuery),它会通过。 如果我改变2.0.0-alpha31(之前工作)和2.0.4之间的另一个版本的zombie.js,它没有任何区别。 在我原来的代码中,我可以在1.7和1.11之间自由更改jQuery版本,没有任何好处。 虽然jQuery似乎是一个触发器,但我不知道它是否是特定于该库的东西,也不知道它是否大量挂载到DOM中。

我也把testing用例放在Runnable上: http : //runnable.com/VDf4OLzyU64cSSuz/zombie-js-test-loading-page-with-jquery-for-node-js-and-mocha (虽然看起来有点在写作时片状)。

任何人都可以build议如何解决这个问题,否则,如何更好地调查?

它现在与僵尸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 

如果我重新创build了确切的初始工作包树,并且做到了:

 cd node_modules/zombie/node_modules/jsdom && npm install cssstyle@0.2.18 

那么它将停止工作。 因此,我将这个问题归因于zombie.js的jsdom依赖关系的cssstyle依赖中引入的不兼容问题。 为node.js模块模式节省我们从依赖地狱:)