如何等待 getJSON 在摩卡测试中完成?
How to wait for getJSON to finish in a Mocha test?
以下文件位于使用 generator-webapp
生成器为 Yeoman 创建的项目中。我的脚本在浏览器中运行,并且 returns 来自 JSON 文件的信息,但在测试中大部分时间都不起作用。测试有时会成功,这意味着测试会打嗝足够长的时间以允许 getJSON 到 return 及时获取数据。在我的搜索中,我找到了各种资源,这里有两个资源听起来应该可以解决我的问题:Whosebug and a blog.
它们都涉及将done
参数传递给it
函数,然后在执行测试后调用done();
。至少,这是我的理解,但它仍然不起作用。我觉得我错过了一些非常明显的东西。
这里是app/scripts/source-data.js
。
var source = (function() {
var sourceData = null;
_loadData();
function _loadData(done) {
$.getJSON("app/data/source.json", function(data) {
sourceData = data;
});
}
function getData() {
return sourceData;
}
return {
getData: getData
};
})();
这里是test/spec/source-data.js
.
(function() {
describe("Source Data", function() {
describe("Data for External Modules", function() {
it("returns the source data from a file", function(done){
expect(source.getData().spec[0].name).to.equal("Spec");
done();
});
});
});
})();
我尝试更改调用 done()
的位置,因为我的理解是 done()
告诉 Mocha 在 getJSON 完成后继续进行其余测试。然而,在这一点上,这只是试验和错误,因为我发现我没有真正的理解。
...
var data = source.getData();
done();
expect(data.spec[0].name).to.equal("Spec");
...
按照上面的方法,我在主脚本中尝试了setTimeout
,但仍然没有用!即使是,我认为我不应该在这种情况下使用 setTimeout
,而是适当地等待 getJSON
.
的解析
你应该使用回调。
例如:
var source = (function() {
var sourceData;
function getData(done) {
if(sourceData){
done(sourceData);
} else {
$.getJSON("app/data/source.json", function(data) {
sourceData = data;
done(data);
});
}
}
return {
getData: getData
};
})();
测试会像这样
(function() {
describe("Source Data", function() {
describe("Data for External Modules", function() {
it("returns the source data from a file", function(done){
source.getData(function(sourceData){
expect(sourceData.spec[0].name).to.equal("Spec");
done();
});
});
});
});
})();
以下文件位于使用 generator-webapp
生成器为 Yeoman 创建的项目中。我的脚本在浏览器中运行,并且 returns 来自 JSON 文件的信息,但在测试中大部分时间都不起作用。测试有时会成功,这意味着测试会打嗝足够长的时间以允许 getJSON 到 return 及时获取数据。在我的搜索中,我找到了各种资源,这里有两个资源听起来应该可以解决我的问题:Whosebug
它们都涉及将done
参数传递给it
函数,然后在执行测试后调用done();
。至少,这是我的理解,但它仍然不起作用。我觉得我错过了一些非常明显的东西。
这里是app/scripts/source-data.js
。
var source = (function() {
var sourceData = null;
_loadData();
function _loadData(done) {
$.getJSON("app/data/source.json", function(data) {
sourceData = data;
});
}
function getData() {
return sourceData;
}
return {
getData: getData
};
})();
这里是test/spec/source-data.js
.
(function() {
describe("Source Data", function() {
describe("Data for External Modules", function() {
it("returns the source data from a file", function(done){
expect(source.getData().spec[0].name).to.equal("Spec");
done();
});
});
});
})();
我尝试更改调用 done()
的位置,因为我的理解是 done()
告诉 Mocha 在 getJSON 完成后继续进行其余测试。然而,在这一点上,这只是试验和错误,因为我发现我没有真正的理解。
...
var data = source.getData();
done();
expect(data.spec[0].name).to.equal("Spec");
...
按照上面的方法,我在主脚本中尝试了setTimeout
,但仍然没有用!即使是,我认为我不应该在这种情况下使用 setTimeout
,而是适当地等待 getJSON
.
你应该使用回调。 例如:
var source = (function() {
var sourceData;
function getData(done) {
if(sourceData){
done(sourceData);
} else {
$.getJSON("app/data/source.json", function(data) {
sourceData = data;
done(data);
});
}
}
return {
getData: getData
};
})();
测试会像这样
(function() {
describe("Source Data", function() {
describe("Data for External Modules", function() {
it("returns the source data from a file", function(done){
source.getData(function(sourceData){
expect(sourceData.spec[0].name).to.equal("Spec");
done();
});
});
});
});
})();