Javascript ';这';仅在组件集成测试中未定义
这是一个余烬组件,在某些情况下需要Javascript ';这';仅在组件集成测试中未定义,javascript,ember.js,qunit,ember-cli-mirage,Javascript,Ember.js,Qunit,Ember Cli Mirage,这是一个余烬组件,在某些情况下需要此: export default Component.extend({ filteredSubs: computed.filter('model.subs', function() { // this will always return true in development http://localhost:4200/dummy // but will always return false in test because 'this'
此
:
export default Component.extend({
filteredSubs: computed.filter('model.subs', function() {
// this will always return true in development http://localhost:4200/dummy
// but will always return false in test because 'this' becomes undefined
return this;
})
});
Dummy
与Sub
有一对多关系:
export default Model.extend({
subs: hasMany('sub')
});
export default Model.extend({
dummy: belongsTo('dummy')
});
此测试失败,但不应:
test('it renders', function(assert) {
let dummy = server.create('dummy');
server.create('sub', { dummy });
this.set('dummy', dummy);
this.render(hbs`{{show-dummy model=dummy}}`);
assert.equal(this.$().text().trim(), 'Hi! There are 1 sub-dummies');
});
不正常13 Chrome 63.0-集成|组件|显示虚拟:它渲染
嗨!有0个子假人
期待:嗨!有1个子假人
- 不确定这是否是一个余烬bug或余烬cli幻影bug
- 我在一份新的回购协议中孤立了这个问题
- 也张贴在
- 你的问题来自一系列令人遗憾的错误假设
您的第一个假设是
Ember.computed.filter中的this
应该是相应的对象。我不能100%肯定这是有记录的行为,我个人也不会相信它。如果您需要完全访问此
,我将使用一个简单的Ember.computed
然而,你的主要错误在于你的测试。这也解释了为什么你只在测试中遇到这个问题。您可以直接使用幻影模型作为组件的模型
:
let dummy = server.create('dummy');
server.create('sub', {
dummy
});
this.set('dummy', dummy);
this.render(hbs`{{show-dummy model=dummy}}`);
在这里,您假设幻影模型server.create
的结果在某些方面类似于ember data
模型。不是!事实上,海市蜃楼模型甚至不是一个ember
对象!因此,您不能在其上使用.get
或.set
,或在模型上定义的任何内容,并且绝对不应将其用作模型für组件测试。相反,您应该使用幻影作为ember数据
模型的数据源
如果您的模型是幻影模型,那么为什么此
未定义的问题会导致:
其中,此
-上下文丢失。基本上,mirage在其自定义的类似数组的结构上覆盖了.filter
函数,但不能确保保持这个-上下文。谢谢@Lux。我现在使用的是filteredSubs:computed('dummy.subs',function(){返回this.get('dummy.subs')。filter(s=>s);})
。.filter
是否应保留此
的上下文现在正在讨论ember cli mirage问题@Lux您建议在组件测试中“伪造”数据是什么?大多数人使用海市蜃楼的服务器。创建,但我不得不承认,它有时行为怪异,正如你提到的,我们并不总能访问.get
或.set
。泰!我认为这并不常见server.create
是生成测试数据的常用方法,但您应该始终使用真实的余烬数据模型来包装它们<代码>存储。推送
可能是您要找的。您是对的。与Mirage的服务器相比,我发现这是在组件集成测试中“模拟对象”的最佳方式。create
或Ember的EmberObject。create
不适用于包含关系的对象
filter(f) {
let filteredModels = this.models.filter(f);
return new Collection(this.modelName, filteredModels);
}