如何存根骨干模型构造函数?

时间:2015-04-14 23:07:44

标签: backbone.js qunit sinon

假设我有自定义骨干模型。

var model = Backbone.Model.extend({
    initialize: function(parameters) {
        var object = {
            key: parameters.key
        };
        this.callMethod();
        this.collection = new Backbone.Collection();
    },

    callMethod: function() {
        //code I want to test
    }
});

如何在不设置所有此对象或使用QUnit和Sinon与测试无关的任何其他内容的情况下测试此模型的新实例?我应该在初始化模型之前以某种方式存根这个初始化方法吗?使用这两个库的正确方法是什么?

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

一旦没有模型实例,就可以存根Model.prototype。

示例:

spyOn(Model.prototype, "initialize");
var modelInstance = new Model();
expect(Model.prototype.initialize).toHaveBeenCalled()

答案 1 :(得分:0)

正如评论所指出的那样,OP似乎真的在寻找initialize存根,而不是constructor存根,而这实际上很容易做到:

sinon.stub(YourModel.prototype, 'initialize');

但要回答主题行中的问题,对于其他读这个问题的人来说...对构造函数进行存根操作有点棘手,因为构造函数基本上就是类本身(即。YourModel是构造函数YourModel类)。这很重要,因为Sinon只知道某些东西的属性的存根函数(例如。initializeYourModel.prototype的属性)。换句话说,Sinon只能存根方法,而constructor不是方法。

解决方案是查看您尝试测试的代码,并在使用它之前查看它是如何获取构造函数的。例如,假设您要在FakeView方法中测试YourModel实例化foo

var FakeView = Backbone.View.extend({
    foo: function() { return new YourModel(); }
});

当写YourModel时不能被删除。但是,如果您稍微更改它,那么YourModel 属性:

var FakeView = Backbone.View.extend({
    foo: function() { return new this.constructor.modelClass(); }
}, {
    modelClass: YourModel
});

然后突然你可以把它留下来:

var stub = sandbox.stub(FakeView, 'modelClass');
new FakeView().foo(); // stub.calledWithNew() === true

希望能帮助其他人挣扎。