0

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

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

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

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

在这里完成小提琴

使用 Mocha,我们可以正式返回承诺,但这完全消除了错误,因此更糟......

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

4

3 回答 3

1

使用 Mocha,我们可以正式返回承诺,但这完全消除了错误,因此更糟......

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

于 2016-06-08T10:37:12.837 回答
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您的断言库提供的任何功能。

于 2016-06-08T03:04:44.263 回答
-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);
});
于 2016-06-08T10:48:53.793 回答