假设我有自定义骨干模型。
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与测试无关的任何其他内容的情况下测试此模型的新实例?我应该在初始化模型之前以某种方式存根这个初始化方法吗?使用这两个库的正确方法是什么?
感谢您的时间。
答案 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只知道某些东西的属性的存根函数(例如。initialize
是YourModel.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
希望能帮助其他人挣扎。