我正在尝试对已经编写的Ember插件进行单元测试,但遗憾的是在创建时没有经过测试。如果可能的话,我真的不想修改现有的代码库来适应测试。
foo() {
return this.get('store').query('stuff', query)
.then((data) => {
this.setProperties({
myList: []
});
data.get('content').mapBy('record').forEach((item) => {
// fails here
this.get('myList').pushObject(item);
});
});
});
}
beforeEach() {
let data = Ember.Object.create({
content: Ember.A([
{ record: { } },
{ record: { } }
]);
});
this.controller = this.subject({
store: {
query(property, query) {
return new Ember.RSVP.Promise(function (resolve) {
resolve(data);
});
}
}
});
}
test('failing test case', function (assert) {
this.controller.foo();
}
Uncaught TypeError: _this.get(...).pushObject is not a function
我做了一些研究,发现Ember默认扩展对象原型,以便标准数组([])成为Ember数组。我已经检查了如何禁用原型扩展here中提到的config/environment.js
,它只返回并清空对象{}。
为什么Ember不包装数组并允许我像我在测试中所期望的那样使用pushObject
?
答案 0 :(得分:1)
使用原型扩展并不是一个好主意。这就是创建ember-disable-prototype-extensions
的原因
当您提供有关包和环境的移动信息时,没有人能够回答为什么Ember不会在您的应用中扩展数组。但你可以通过显式使用Ember.Array
来解决问题而不是
this.setProperties({
myList: []
});
使用
this.setProperties({
myList: Ember.A()
});
这将是很好的原因,以防止将来出现此类错误(更新依赖项/包)