使用Jasmine进行测试时,Backbone Collection为空

时间:2012-11-16 01:49:57

标签: backbone.js jasmine

我刚刚开始使用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;
                }
            });
        }

    });
});

2 个答案:

答案 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
});