如何测试在Ember中返回PromiseArray的计算属性

时间:2018-02-17 17:03:20

标签: ember.js ember-data

我有一个计算属性,询问服务器的用户数据,然后另一个计算用户数。要将更改传播到模板,我使用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.任何想法?

1 个答案:

答案 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)。