当我需要检查承诺中的内容时,我很难在测试中获得有意义的失败。
这是因为当断言失败时,大多数测试框架都会使用throw
,但那些被承诺的then
吸收......
例如,在下面我想让Mocha告诉我'hello'
不等于'world'
......
Promise.resolve(42).then(function() {
"hello".should.equal("world")
})
借助摩卡,我们可以正式回复承诺,但是swallows completely the error因此更加糟糕......
注意:我正在使用mocha
和expect.js
(因为我希望与IE8兼容)
答案 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);
});