如何测试 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)。