是否存在模仿 should.throws 的 shouldjs 函数?

Does there exist a shouldjs function that mimics should.throws for promises?

我正在编写一个测试 promise 返回函数的测试套件。这些测试的一个共同主题是需要检查返回承诺的函数在传递无效参数时是否正确抛出错误。我试过使用 should.throws,但在查看代码时我发现它不是为 promises 而设计的。

我已经制作了以下实用函数来获得我需要的功能:

var TestUtil = module.exports;
var should = require('should');

/**
 * Checks if a promise chain throws an error, and optionally that the error includes
 * the given errorMsg
 * @param promise {String} (optional) error message to check for
 * @param errorMsg
 */
TestUtil.throws = function(promise, errorMsg) {
  return promise
  .then(function(res) {
throw new Error(); // should never reach this point
  })
  .catch(function(e) {
if (errorMsg) {
  e.message.should.include(errorMsg);
}
should.exist(e);
  });
};

是否存在做同样事情的 shouldjs 函数?我想通过只使用 shouldjs api 来检查而不是使用这个一次性函数来保持我的测试的凝聚力。

正如 den bardadym 所说,我正在寻找的是 .rejectedWith,它是 shouldjs 的 promise 断言函数之一。你可以这样使用它(直接从 shouldjs 的 API 文档中复制):

function failedPromise() {
  return new Promise(function(resolve, reject) {
    reject(new Error('boom'))
  })
}
failedPromise().should.be.rejectedWith(Error);
failedPromise().should.be.rejectedWith('boom');
failedPromise().should.be.rejectedWith(/boom/);
failedPromise().should.be.rejectedWith(Error, { message: 'boom' });
failedPromise().should.be.rejectedWith({ message: 'boom' });

// test example with mocha it is possible to return promise
it('is async', () => {
   return failedPromise().should.be.rejectedWith({ message: 'boom' });
});