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

How do I get a meaningful test error when assertion is in a promise?

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

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

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

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

Complete fiddle here

有了 Mocha,我们可以正式 return 承诺,但这 swallows completely the error 因此更糟...

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

这与其说是一个答案不如说是一个建议?使用 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 功能。

With Mocha we can officially return the promise, but this swallows completely the error and is thus much worse...

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

要测试失败的 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);
});