Javascript规范:承诺链并省略期望

时间:2016-09-06 17:14:54

标签: javascript testing promise

考虑以下规范:

describe('User', () => {
  it('requires username', done => {
    factory.build('user', { username: '' })
      .then(user => user.validate())
      .catch(error => expect(error.errors.messages.username).toMatch('is required'))
      .then(done);
  });
});

在这种情况下,如果创建成功,则不会调用catch回调,我们是done。所以基本上规范成功,而它应该失败。 这只是一个普遍问题的一个例子:当我们将期望置于then / catch内时,我们无法确定它们是否会被调用。

你会怎么写这个?

对于这个具体的例子,我可以想到这样的解决方案(但我不喜欢以这种方式将回调与承诺混合):

describe('User', () => {
  it('requires username', done => {
    factory.build('user', { username: '' })
      .then(user => user.validate(error =>
        expect(error.errors.messages.username).toMatch('is required')))
      .then(done);
  });
});

1 个答案:

答案 0 :(得分:2)

如果你不期望,你会抛出一个错误:

return factory.build('user', { username: '' })
  .then(user => user.validate())
  .then(result => { throw new Error("expected rejection but got fulfilled promise"); },
        error => expect(error.errors.messages.username).toMatch('is required'))

或者,您可以手动或使用诸如reflect之类的promise方法将两种情况转换为您匹配的结果值:

  .then(result => null,
        error => error)
  .then(val => expect(val.errors.messages.username).toMatch('is required'))

如果您知道result永远不是类似错误的对象,则可以省略第一个onFulfilled回调或仅使用catch