如何 'reverse' 一个 promise 的 rejection/fulfillment?

How to 'reverse' the rejection/fulfillment of a promise?

对于 mocha 测试,我想断言一个 promise 最终会被拒绝。

我不想像承诺的那样使用 chai。我更愿意只使用 Node 的标准断言模块,并且只使用标准的 ES6 承诺。

我想到的最好的是这个,但感觉有点老套:

it('foo should reject given bad data', function () {
  var rejected;

  return foo('bad data').catch(function (err) {
    rejected = true;
  }).then(function () {
    assert(rejected);
  });
});

谁能建议一种更简洁、更具表现力的方式来 'reverse' 承诺,这样拒绝就变成了履行,反之亦然?

您可以直接对通过 truefalse 的解决和拒绝回调进行断言。

it('foo should reject given bad data', function () {
  return foo('bad data').then(function () {
      assert(false);
  }, function () {
      assert(true);
  });
});

您可以像这样使用单个 .done() 来做到这一点:

it('foo should reject given bad data', function () {
  return foo('bad data')
  .done(assert.equal.bind(null, 'false', 'true', null), assert);
});

我使用了 assert.equal 的值,它将提供 assert(false) 的等效值,但如果您想打印实际结果,您显然可以删除最后一个 null

编辑: 您实际上可以通过定义您自己的 assertFail 函数来为多个测试清洁此程序:

function assertFail () { assert(false); }

it('foo should reject given bad data', function () {
  return foo('bad data')
  .done(assertFail, assert);
});

您可以在 Promise 原型中添加一个反向方法,然后直接使用它。

Promise.prototype.reverse = function() {
  return new Promise((resolve, reject) => {
    this.then(reject).catch(resolve);
  });
}

foo('bad data')
  .reverse()
  .then(e => assert(true))
  .catch(e => assert(false));