使用mocha的内置承诺支持测试失败的承诺

Roy*_*oyM 9 javascript mocha.js node.js promise

我应该怎样用mocha和chai测试我的承诺失败了?

我很困惑,因为我最初认为我应该使用'mocha-as-promised',但是该软件包现在已被弃用(我正在使用mocha 2.1.0),建议只使用现在内置的promise测试摩卡.请参阅:https://github.com/domenic/mocha-as-promised

另一篇文章建议废除it()回调的'done'参数 - 不确定我理解为什么,因为我的理解是传递'done'参数是表示测试是异步测试的方式.请参阅:如何使用mocha和chai正确测试承诺?

无论如何,我试图将我的问题减少到下面的代码 - 请帮我修改这个,以便我可以测试我的承诺确实失败了.

it.only("do something (negative test)", function (done) {

  var Q = require('q');

  function makePromise() {
    var deferred = Q.defer();
    deferred.reject(Error('fail'));
    return deferred.promise;
  };

  makePromise()
  .then(done, done);

});
Run Code Online (Sandbox Code Playgroud)

Roy*_*oyM 9

更多的挖掘,似乎正确的方法是添加一个额外的捕获块,如此...

it.only("do something (negative test)", function (done) {

  var Q = require('q');

  function makePromise() {
    var deferred = Q.defer();
    deferred.reject(Error('fail'));
    return deferred.promise;
  };

  makePromise()
  .catch(function(e) {
    expect(e.message).to.equal('fail');
  })
  .then(done, done);

});
Run Code Online (Sandbox Code Playgroud)

我对其他想法很感兴趣,或者确认这样做很好..谢谢.

更新:

本 - 我现在说你说的是什么,尤其是.在本杰明G的简短但有用的评论之后

总结一下:

当你传入一个done参数时,测试应该通过调用done()函数触发它的'done-ness' ;

如果未传入done参数,则通常仅适用于同步调用.但是,如果你返回一个promise,mocha框架(mocha> 1.18)将捕获通常会被吞下的任何失败(根据promises规范).这是一个更新版本:

it.only("standalone neg test for mocha+promises", function () {

  var Q = require('q');

  function makePromise() {
    var deferred = Q.defer();
    deferred.reject(Error('fail'));
    return deferred.promise;
  };

  return makePromise()
  .catch(function(e) {
    expect(e.message).to.equal('fail');
  });

});
Run Code Online (Sandbox Code Playgroud)

  • 你可以'返回'`makePromise()`并删除`done,done`部分. (2认同)
  • 我将添加一个额外的断言,以确保它没有达到接受情况。`return makePromise().then(()=> {//我们不应该在这里到达。Expect()。fail('似乎没有抛出异常');},(e)=> {/ /失败的情况下,我们应该到达此处,消息应该匹配Expect(e.message).to.equal('fail');});。` (2认同)

Ben*_*Ben 3

您可以返回一个承诺来表明测试是异步的:

function something() {
  return Q.reject(Error('fail'));
}

it('should reject', function() {
  return something().then(function() {
    throw new Error('expected rejection');
  },
  function() {
    return 'passed :]';
  });
});
Run Code Online (Sandbox Code Playgroud)