使用 chai 和 promises 捕捉错误

Catching errors with chai and promises

我想知道如何阻止控制台在带有抛出错误的承诺的测试中打印堆栈转储。

doCallTest = function() {
  var p = new Promise(function(resolve, reject) {
      reject(new Error('Nooooo'));
  }).catch(function(err) {
    throw new Error(err);
  });
  return Promise.delay(100).return(p);
};


// This prints error message `Error: Nooooo` and stack dump and halts the test
return expect(doCallTest()).to.eventually.be.rejectedWith('Nooooo');

我看到很多人提到类似的问题,但不确定如何解决。有 Bluebird.onPossiblyUnhandledRejection 但那太乱了:

var P = require('bluebird');
P.onPossiblyUnhandledRejection(function(error){
   expect(error.message).to.be.eql('Nooooo');
   done();
});
doCallTest();

如何使用 Chai 的 promises 抛出错误测试?

编辑 我已将范围缩小到 delay() 调用。删除它可以正常工作。

可能相关:https://github.com/petkaantonov/bluebird/issues/100

更新 这个问题似乎是因为我使用 delay() as:

return Promise.delay(100).return(p);

而不是:

return p.delay(100);

后者最初对我不起作用,这就是我更改它的原因 - 我怀疑这是因为我的 catch 调用是如何设置的。通过改变周围的东西,我能够使用后一种格式:

doCallTest = function() {
  var p = new Promise(function(resolve, reject) {
      reject(new Error('Nooooo'));
  });
  return p.delay(100);
};

doCallTest returns 一个错误拒绝的承诺,而不是字符串 "Nooooo"。 (作为旁注,请不要拒绝无错误)

试试这个,它会拒绝字符串:

doCallTest = function() {
  return P.reject('Nooooo');
};