高效地编写承诺测试

Efficiently composing promise tests

我发现自己经常像这样为异步 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 returns 一个承诺,那么 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 函数的方法。

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

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

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

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