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