首页 文章

使用mocha的内置承诺支持测试失败的承诺[重复]

提问于
浏览
8

这个问题在这里已有答案:

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

我很困惑,因为我最初认为我应该使用'mocha-as-promised',但该软件包现已弃用(我现在已经内置到mocha中了 . 请参阅:https://github.com/domenic/mocha-as-promised

另一篇文章建议取消对it()回调的'done'参数 - 不确定我理解为什么,因为我理解传递'done'参数是表示测试是异步测试的方式 . 见:How do I properly test promises with mocha and 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);

});

3 回答

  • 10

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

    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);
    
    });
    

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

    更新:

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

    总结一下:

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

    如果未传入 done 参数,则通常仅适用于同步调用 . 但是,如果你承诺,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');
      });
    
    });
    
  • 3

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

    function something() {
      return Q.reject(Error('fail'));
    }
    
    it('should reject', function() {
      return something().then(function() {
        throw new Error('expected rejection');
      },
      function() {
        return 'passed :]';
      });
    });
    
  • 0

    chai-as-promised 为Promises提供了一个干净的测试框架:

    $ npm install chai-as-promised
    

    在您的测试文件中:

    var chai = require('chai');
    var expect = chai.expect;
    var chaiAsPromised = require("chai-as-promised");
    chai.use(chaiAsPromised);
    
    ...
    
    it('resolves as promised', function() {
        return expect(Promise.resolve('woof')).to.eventually.equal('woof');
    });
    
    it('rejects as promised', function() {
        return expect(Promise.reject('caw')).to.be.rejectedWith('caw');
    });
    

    这感觉干净,直观 . 但你可以完成类似的东西,而不像这样承诺:

    it('resolved as promised', function() {
        return Promise.resolve("woof")
            .then(function(m) { expect(m).to.equal('woof'); })
            .catch(function(m) { throw new Error('was not supposed to fail'); })
                ;
    });
    
    it('rejects as promised', function() {
        return Promise.reject("caw")
            .then(function(m) { throw new Error('was not supposed to succeed'); })
            .catch(function(m) { expect(m).to.equal('caw'); })
                ;
    });
    

相关问题