我有一个计算属性,询问服务器的用户数据,然后另一个计算用户数。要将更改传播到模板,我使用DS.PromiseArray包装器。有了这个包装器,我找不到一种简单的方法来测试这个属性。
// model
users: computed('name', function () {
let name = get(this, 'name');
return DS.PromiseArray.create({
promise: this.store.query('user', { name })
});
}),
numberOfUsers: computed('users', function () {
return get(this, 'users.length') || 0;
}),
// ....
test('numberOfUsers returns correct number', function (assert) {
let model = this.subject({
store: EmberObject.create({
query() {
return Promise.resolve([
{ name: 'Thomas' },
{ name: 'Thomas' },
{ name: 'Thomas' },
]);
}
}),
name: 'Thomas',
});
assert.equal(model.get('numberOfUsers'), 3);
});
此测试失败0!== 3.任何想法?
答案 0 :(得分:0)
由于model.get('users')
是一个承诺,model.get('numberOfUsers')
在Promise结算之前不会是3。在您的测试中,您立即调用model.get('numberOfUsers')
,并使用model.get('users')
的初始值,这是一个未解决的承诺。
要让它发挥作用,您可以致电users
并将assert
置于返回承诺的then
内:
model.get('users').then((user) => {
assert.equal(model.get('numberOfUsers'), 3);
})
几个旁注:
在Ember中传统的做法是在Route's model hook中进行数据提取,而不是在这样的组件中进行数据提取。
此外,您无需在应用程序代码中手动创建PromiseArray
,因为Ember数据query
已经返回一种Promise数组。所以你可以return this.store.query('user', { name });
(如果这样做,你将不得不改变测试查询存根以生成PromiseArray
)。