如何用Mocha测试承诺

时间:2013-02-25 01:32:21

标签: javascript mocha chai es6-promise chai-as-promised

我正在使用Mocha来测试一个返回promise的异步函数。

测试承诺是否解析为正确值的最佳方法是什么?

2 个答案:

答案 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'