JSDom没有加载相关脚本

时间:2015-04-06 23:30:56

标签: javascript jquery node.js mocha jsdom

所以我正在尝试使用jsdom设置mocha测试,经过多次调试尝试后,我将问题缩小到jsdom执行绝对URL脚本(例如http://code.jquery.com/jquery-2.1.3.min.js)但不是相对URL脚本(例如{{ 1}})。

我的test.js如下:

js/script.js

错误: var assert = require("assert"); var fs = require('fs'); var jsdom = require("jsdom"); describe('Foo Test', function(){ it('Foo Check', function(done){ this.timeout(5000); jsdom.env({ html: fs.readFileSync('index.htm') ,features: { FetchExternalResources: ["script"] ,ProcessExternalResources: ["script"] } ,done: function(errors, window){ if(errors != null) console.log('Errors', errors); var $ = window.$; // $ is defined var foo = window.foo; //foo is undefined assert(foo); done(); } }); }); });

htm:

Uncaught AssertionError: undefined == true

的script.js:

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Foo</title>
      <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
      <script src="js/script.js"></script>      
  </head>

  <body>
  </body>
</html>

2 个答案:

答案 0 :(得分:2)

在致电jsdom.env时,请移除html并使用file。我用jsdom 3.1.2测试了你的代码修改,它的工作原理是:

    jsdom.env({
        file: path.join(__dirname, "index.htm")
        ,features: {
        [... etc ...]

(您还需要在其他var path = require("path")电话中添加require。)

使用html的问题是,然后jsdom不知道HTML的基本URL是什么。如果您使用file,它将从您提供的路径加载代码,并将路径用作基本URL。

答案 1 :(得分:1)

从3.0开始,url参数现在默认设置为about:blank,而不是implcitly设置为当前dir。一旦我添加url: __dirname,测试就会显示为绿色。

var assert = require("assert");
var fs = require('fs');
var jsdom = require("jsdom");

describe('Foo Test', function(){
    it('Foo Check', function(done){
        this.timeout(5000);

        jsdom.env({
            html: fs.readFileSync('index.htm')
            ,url: __dirname
            ,features: {
                FetchExternalResources: ["script"]
                ,ProcessExternalResources: ["script"]
            }
            ,done: function(errors, window){
                if(errors != null) console.log('Errors', errors);
                var $ = window.$; // $ is defined
                var foo = window.foo; //foo is undefined
                assert(foo);
                done();
            }
        });
    });
});

另外我想提一下,jQuery 2.x目前似乎与jsdom不兼容。