javascript - 使用 chai 和 Promise 捕获错误

标签 javascript promise bluebird chai chai-as-promised

我想知道如何阻止控制台在测试时打印堆栈转储并 promise 抛出错误。

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.onPossouslyUnhandledRejection 但这只是困惑:

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

我如何利用 Chai 的带有 Promise 的抛出错误测试?

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

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

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

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 返回一个因错误而拒绝的 promise ,而不是字符串 "Nooooo"。 (作为旁注,请不要在没有错误的情况下拒绝)

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

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

关于javascript - 使用 chai 和 Promise 捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28642637/

相关文章:

javascript - 保存 promise 的变化变量

javascript - Bootstrap Carousel 上一个/下一个控件不起作用

javascript - 路径。如何选择所有文本节点但只选择 'option'元素中的 'select'

javascript - 使用 javascript 将数据值分配给 href?

javascript - 如何在解决所有 javascript ES6 Promises 后运行

javascript - jQuery ".then()"不连续,并且工作不按预期

mysql - 在发送 HTTP 响应之前捕获 mysql 错误

JavaScript - 无法解决此问题 'warning: promise was created in a handler'

javascript - 通过单击窗口外部防止 Jquery 弹出窗口关闭

javascript - 使用 Promises 在 for 循环中调用 API 的最佳方法