Javascript JSDom未加载相关脚本
因此,我试图用jsdom设置一个mocha测试,在多次调试之后,我将问题缩小到jsdom执行绝对URL脚本(例如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
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 ...]