如何测试 Ember 中 returns PromiseArray 的计算 属性
How to test computed property that returns PromiseArray in Ember
我有一个计算 属性 请求服务器提供用户数据,然后另一个计算用户数。为了将更改传播到模板中,我使用了 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 而失败。有什么想法吗?
因为 model.get('users')
是一个承诺,所以 model.get('numberOfUsers')
在承诺解决之前不会是 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
returns 已经是一种 Promise 数组。所以你可以 return this.store.query('user', { name });
(如果你这样做,你将不得不更改你的测试查询存根以生成 PromiseArray
)。
我有一个计算 属性 请求服务器提供用户数据,然后另一个计算用户数。为了将更改传播到模板中,我使用了 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 而失败。有什么想法吗?
因为 model.get('users')
是一个承诺,所以 model.get('numberOfUsers')
在承诺解决之前不会是 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
returns 已经是一种 Promise 数组。所以你可以 return this.store.query('user', { name });
(如果你这样做,你将不得不更改你的测试查询存根以生成 PromiseArray
)。