如何逆转'拒绝/履行承诺?

时间:2015-10-16 17:21:17

标签: javascript es6-promise

对于摩卡测试,我想断言承诺最终会拒绝。

我不想使用chai-as-promised。我更喜欢使用Node的标准断言模块,而只是使用标准的ES6承诺。

我能想到的最好的就是这个,但感觉有点hacky:

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

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

任何人都可以建议一个更整洁,更有表现力的方式来扭转这种情况。承诺,所以拒绝变为满足,反之亦然?

3 个答案:

答案 0 :(得分:1)

您可以直接断言传递truefalse的分辨率和拒绝回调。

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

答案 1 :(得分:1)

您可以使用单个.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);
});

答案 2 :(得分:-1)

您可以向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));