有效地编写承诺测试

时间:2015-05-14 18:11:26

标签: javascript mocha bluebird

我发现自己经常为这样的异步API编写测试:

beforeEach(function(done) {
  setup()
  .then(function(val) {
    return setup2();
  })
  .done(done, done);
});

it('should test something', function(done) {
  promiseFunction
  .then(function(val) {
    expect(val).to.be.something;
  })
  .done(done, done);
});

除了beforeEach函数之外,这看起来非常简单:如果setup2返回一个promise,那么将使用一个值来调用done,它并不喜欢。所以我最终不得不写:

.done(function() { done(); }, done)

这一切都很好,但我想知道是否有更紧凑的方式来做到这一点(是的,我懒惰!)。像

.catch(done) //handle fail
.then(null)  //strip the promise value
.then(done)  //handle success

then需要一个功能。我知道一个简单的解决方案就是给自己写另一个函数:

function noParam(done) { done(); }

并使用:

.done(noParam(done), done);

我只是想知道是否有更好的方法来构建这个或者使用现有的API函数。

1 个答案:

答案 0 :(得分:2)

如果done使用节点回调约定,您将需要查看.asCallback方法。你可以做

beforeEach(function(done) {
  setup()
  .then(function(val) {
    return setup2();
  })
  .asCallback(done);
});

而且mocha(除非你使用非常旧的版本)支持返回promises,所以你的测试代码可以写成:

it('should test something', function() {
  return promiseFunction
  .then(function(val) {
    expect(val).to.be.something;
  });
});