我刚刚开始使用Jasmine并尝试首次设置一些测试。我有一个Backbone集合。我想我会把我的集合作为beforeEach()方法的一部分,然后对它进行测试。
我有一个测试json对象,我在我的应用程序原型时使用了,所以我宁愿重复使用该对象进行测试,而不是模拟调用。
到目前为止,这是我的代码(并且失败了)。
describe("Vehicle collection", function() {
beforeEach(function() {
this.vehicleCollection = new Incentives.VehiclesCollection();
this.vehicleCollection.url = '../../json/20121029.json';
this.vehicleCollection.fetch();
console.log(this.vehicleCollection);
});
it("should contain models", function() {
expect(this.vehicleCollection.length).toEqual(36);
console.log(this.vehicleCollection.length); // returns 0
});
});
当我在beforeEach方法中使用console.log时 - 控制台看起来像这样......
d {length: 0, models: Array[0], _byId: Object, _byCid: Object, url: "../../json/20121029.json"}
奇怪的是,当我在Chrome开发者工具中展开对象(小三角形)时 - 我的收藏完全填充了一系列车型等等。但我的测试仍然失败:
Error: Expected 0 to equal 36
我想知道我是否需要利用“waitsFor()”方法?
更新(带工作代码)
感谢您的帮助!
@ deven98602 - 你让我走上正轨。最终,这个“waitsFor()”实现终于奏效了。我希望这段代码可以帮助别人!如果这是一个糟糕的技术,请留下评论。谢谢!
describe("A Vehicle collection", function() {
it("should contain models", function() {
var result;
var vehicleCollection = new Incentives.VehiclesCollection();
vehicleCollection.url = '/json/20121029.json';
getCollection();
waitsFor(function() {
return result === true;
}, "to retrive all vehicles from json", 3000);
runs(function() {
expect(vehicleCollection.length).toEqual(36);
});
function getCollection() {
vehicleCollection.fetch({
success : function(){
result = true;
},
error : function () {
result = false;
}
});
}
});
});
答案 0 :(得分:2)
只要看一下你的代码,我就会发现fetch
在运行期望时还没有填充集合。
您可以使用fetch
的返回值推迟期望,直到使用waitsFor
and runs
收到回复:
beforeEach(function() {
this.vehicleCollection = new Incentives.VehiclesCollection();
this.vehicleCollection.url = '../../json/20121029.json';
var deferred = this.vehicleCollection.fetch();
waitsFor(function() { return deferred.done() && true });
});
it("should contain models", function() {
runs(function() {
expect(this.vehicleCollection.length).toEqual(36);
});
});
我实际上没有尝试过这不能保证它会按原样运行,但解决方案看起来会像这样。有关使用Jasmine进行异步测试的更多信息,请参阅this article。
答案 1 :(得分:1)
collection.fetch()是接受成功和错误回调的异步调用
var result;
this.collection.fetch({success : function(){
result = true;
}})
waitsFor(function() {
return response !== undefined;
}, 'must be set to true', 1000);
runs(function() {
expect(this.vehicleCollection.length).toEqual(36);
console.log(this.vehicleCollection.length); // returns 0
});