当断言是在一个承诺中时,如何获得有意义的测试错误?

时间:2016-06-08 02:21:02

标签: javascript unit-testing promise mocha expect.js

当我需要检查承诺中的内容时,我很难在测试中获得有意义的失败。

这是因为当断言失败时,大多数测试框架都会使用throw,但那些被承诺的then吸收......

例如,在下面我想让Mocha告诉我'hello'不等于'world' ......

Promise.resolve(42).then(function() {
  "hello".should.equal("world") 
})

Complete fiddle here

借助摩卡,我们可以正式回复承诺,但是swallows completely the error因此更加糟糕......

注意:我正在使用mochaexpect.js(因为我希望与IE8兼容)

3 个答案:

答案 0 :(得分:1)

  

使用摩卡,我们可以正式回复承诺,但这完全吞噬了错误,因此更糟糕......

在您的小提琴中,您使用的是Mocha 1.9,其日期为2013年4月,并且不支持从测试中返回承诺。如果我将你的小提琴升级到最新的Mocha,它就可以正常工作。

答案 1 :(得分:0)

这不是一个答案,而是一个建议?使用before钩子在这里很有用。

describe('my promise', () => {

  let result;
  let err;

  before(done => {
    someAsync()
      .then(res => result = res)
      .then(done)
      .catch(e => {
        err = e;
        done();
      });
  });

  it('should reject error', () => {
    err.should.not.be.undefined(); // I use chai so I'm not familiar with should-esque api
    assert.includes(err.stack, 'this particular method should throw')
  });

});

您也可以使用sinon进行同步模拟,然后使用断言库提供的任何should.throw功能。

答案 2 :(得分:-1)

要测试失败的Promise,请执行以下操作:

it('gives unusable error message - async', function(done){
  // Set up something that will lead to a rejected promise.
  var test = Promise.reject(new Error('Should error'));

  test
    .then(function () {
      done('Expected promise to reject');
    })
    .catch(function (err) {
      assert.equal(err.message, 'Should error', 'should be the error I expect');
      done();
    })
    // Just in case we missed something.
    .catch(done);
});