我正在使用Mocha来测试一个返回promise的异步函数。
测试承诺是否解析为正确值的最佳方法是什么?
答案 0 :(得分:8)
Mocha自1.18.0版(2014年3月)起内置了Promise支持。您可以从测试用例中返回一个承诺,Mocha将等待它:
it('does something asynchronous', function() { // note: no `done` argument
return getSomePromise().then(function(value) {
expect(value).to.equal('foo');
});
});
请勿忘记第二行的return
关键字。如果你不小心忽略它,Mocha会认为你的测试是同步的,它不会等待.then
函数,所以即使断言失败你的测试也会一直通过。
如果这种情况过于重复,您可能需要使用chai-as-promised库,它会为您提供eventually
属性,以便更轻松地测试承诺:
it('does something asynchronous', function() {
return expect(getSomePromise()).to.eventually.equal('foo');
});
it('fails asynchronously', function() {
return expect(getAnotherPromise()).to.be.rejectedWith(Error, /some message/);
});
同样,不要忘记return
关键字!
答案 1 :(得分:4)
然后'返回'一个可以用来处理错误的promise。大多数库都支持名为done
的方法,该方法将确保抛出任何未处理的错误。
it('does something asynchronous', function (done) {
getSomePromise()
.then(function (value) {
value.should.equal('foo')
})
.done(() => done(), done);
});
您还可以使用mocha-as-promised之类的东西(其他测试框架也有类似的库)。如果您正在运行服务器端:
npm install mocha-as-promised
然后在你的剧本开头:
require("mocha-as-promised")();
如果您正在运行客户端:
<script src="mocha-as-promised.js"></script>
然后在测试中你可以回复承诺:
it('does something asynchronous', function () {
return getSomePromise()
.then(function (value) {
value.should.equal('foo')
});
});
或者在咖啡脚本中(根据您的原始示例)
it 'does something asynchronous', () ->
getSomePromise().then (value) =>
value.should.equal 'foo'