摩卡中的 ES6 承诺
ES6 Promises in Mocha
我正在使用 this polyfill for ES6 promises 和 Mocha / Chai。
我对承诺的断言无效。以下为样例测试:
it('should fail', function(done) {
new Promise(function(resolve, reject) {
resolve(false);
}).then(function(result) {
assert.equal(result, true);
done();
}).catch(function(err) {
console.log(err);
});
});
当我 运行 此测试由于超时而失败。在 then 块中抛出的断言失败在 catch 块中被捕获。我怎样才能避免这种情况,直接把它扔给摩卡呢?
我可以直接从 catch 函数中抛出它,但是我该如何为 catch 块做出断言?
如果您的 Promise 失败,它只会调用您的 catch 回调。结果,Mocha 的 done 回调永远不会被调用,并且 Mocha 永远不会发现 Promise 失败(所以它等待并最终超时)。
您应该将 console.log(err);
替换为 done(err);
。当您将错误传递给 done 回调时,Mocha 应该会自动显示错误消息。
我最终使用 Chai as Promised 解决了我的问题。
它允许您对承诺的解决和拒绝做出断言:
return promise.should.become(value)
return promise.should.be.rejected
我在 Mocha/Chai/es6-promise 测试中使用的模式如下:
it('should do something', function () {
aPromiseReturningMethod(arg1, arg2)
.then(function (response) {
expect(response.someField).to.equal("Some value")
})
.then(function () {
return anotherPromiseReturningMethod(arg1, arg2)
})
.then(function (response) {
expect(response.something).to.equal("something")
})
.then(done).catch(done)
})
最后一行看起来很奇怪,但在成功或错误时调用 Mocha 的 done。
一个问题是如果最后一个 returns 东西,我需要在 then
和 catch
之前 noop()*:
it('should do something', function () {
aPromiseReturningMethod(arg1, arg2)
.then(function (response) {
expect(response.someField).to.equal("Some value")
})
.then(function () {
return anotherPromiseReturningMethod(arg1, arg2)
})
.then(_.noop).then(done).catch(done)
})
*Lodash 的 noop()。
希望听到对这种模式的任何批评。
我正在使用 this polyfill for ES6 promises 和 Mocha / Chai。
我对承诺的断言无效。以下为样例测试:
it('should fail', function(done) {
new Promise(function(resolve, reject) {
resolve(false);
}).then(function(result) {
assert.equal(result, true);
done();
}).catch(function(err) {
console.log(err);
});
});
当我 运行 此测试由于超时而失败。在 then 块中抛出的断言失败在 catch 块中被捕获。我怎样才能避免这种情况,直接把它扔给摩卡呢?
我可以直接从 catch 函数中抛出它,但是我该如何为 catch 块做出断言?
如果您的 Promise 失败,它只会调用您的 catch 回调。结果,Mocha 的 done 回调永远不会被调用,并且 Mocha 永远不会发现 Promise 失败(所以它等待并最终超时)。
您应该将 console.log(err);
替换为 done(err);
。当您将错误传递给 done 回调时,Mocha 应该会自动显示错误消息。
我最终使用 Chai as Promised 解决了我的问题。
它允许您对承诺的解决和拒绝做出断言:
return promise.should.become(value)
return promise.should.be.rejected
我在 Mocha/Chai/es6-promise 测试中使用的模式如下:
it('should do something', function () {
aPromiseReturningMethod(arg1, arg2)
.then(function (response) {
expect(response.someField).to.equal("Some value")
})
.then(function () {
return anotherPromiseReturningMethod(arg1, arg2)
})
.then(function (response) {
expect(response.something).to.equal("something")
})
.then(done).catch(done)
})
最后一行看起来很奇怪,但在成功或错误时调用 Mocha 的 done。
一个问题是如果最后一个 returns 东西,我需要在 then
和 catch
之前 noop()*:
it('should do something', function () {
aPromiseReturningMethod(arg1, arg2)
.then(function (response) {
expect(response.someField).to.equal("Some value")
})
.then(function () {
return anotherPromiseReturningMethod(arg1, arg2)
})
.then(_.noop).then(done).catch(done)
})
*Lodash 的 noop()。
希望听到对这种模式的任何批评。