作为我对骨干项目的单元测试(使用 QUnit)的一部分,我测试了一些返回骨干模型数组的集合操作函数。
有没有办法直接测试(为了理智起见)我的数组中的对象是否扩展 Backbone.Model 或者我应该只做一个鸭子类型检查(如果是这样,如何以及在哪个唯一属性上)?
由于 javascript 中没有真正的“类”构造,typeof
因此显然不会在这里解决问题。
我可以看到这在我的 Collections 的其他测试中很有用,或者检查事物是否是我的特定 Backbone 类的实例等。
作为我对骨干项目的单元测试(使用 QUnit)的一部分,我测试了一些返回骨干模型数组的集合操作函数。
有没有办法直接测试(为了理智起见)我的数组中的对象是否扩展 Backbone.Model 或者我应该只做一个鸭子类型检查(如果是这样,如何以及在哪个唯一属性上)?
由于 javascript 中没有真正的“类”构造,typeof
因此显然不会在这里解决问题。
我可以看到这在我的 Collections 的其他测试中很有用,或者检查事物是否是我的特定 Backbone 类的实例等。
如何使用instanceof
:
console.log(yourObject instanceof Backbone.Model);
instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。
对对象类型的检查是 JavaScript 等语言中的代码异味。
如果您需要在调用特定方法时知道您的集合正在返回特定模型,请使用已知模型填充集合并与这些模型进行比较。
MyModel = Backbone.Model.extend({});
MyCollection = Backbone.Collection.extend({
model: MyModel,
getThatOne: function(){
return this.at[0];
}
});
m1 = new MyModel();
m2 = new MyModel();
col = new MyCollection([m1, m2]);
retrieved = col.getThatOne();
retrieved === m1 //=> true