Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSDom未加载相关脚本_Javascript_Jquery_Node.js_Mocha.js_Jsdom - Fatal编程技术网

Javascript JSDom未加载相关脚本

Javascript JSDom未加载相关脚本,javascript,jquery,node.js,mocha.js,jsdom,Javascript,Jquery,Node.js,Mocha.js,Jsdom,因此,我试图用jsdom设置一个mocha测试,在多次调试之后,我将问题缩小到jsdom执行绝对URL脚本(例如http://code.jquery.com/jquery-2.1.3.min.js),但不是相对URL脚本(例如js/script.js) 我的test.js如下: var assert = require("assert"); var fs = require('fs'); var jsdom = require("jsdom"); describe('Foo Test', fu

因此,我试图用jsdom设置一个mocha测试,在多次调试之后,我将问题缩小到jsdom执行绝对URL脚本(例如
http://code.jquery.com/jquery-2.1.3.min.js
),但不是相对URL脚本(例如
js/script.js

我的test.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();
            }
        });
    });
});
错误是:
Uncaught断言错误:未定义==true

htm:

<!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>

从3.0开始,url参数现在默认设置为about:blank,而不是直接设置为current dir。一旦我添加了
url:uu 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();
            }
        });
    });
});

我还想指出,jquery2.x目前似乎与jsdom不兼容。

在调用
jsdom.env
时,删除
html
并使用
文件。我已经用jsdom 3.1.2测试了对代码的这种修改,它可以工作:

    jsdom.env({
        file: path.join(__dirname, "index.htm")
        ,features: {
        [... etc ...]
(您还需要将
var path=require(“path”)
与其他
require
调用一起添加。)


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

有机会尝试一下,它在没有path.join的情况下工作,因为test.js在它自己的文件夹中(因此它试图在测试文件夹中找到一个与根相对的index.htm)。另外请注意,从v10开始,jsdom有一个新的api,但是它仍然支持旧的语法,所以为了使用旧语法,您需要像这样包含它:
var-jsdom=require(“jsdom/lib/old-api.js”)(请参阅)
    jsdom.env({
        file: path.join(__dirname, "index.htm")
        ,features: {
        [... etc ...]