done()回调有什么意义?

The*_*ter 20 javascript callback mocha.js node.js

在Mochajs中,他们使用"done()"来测试异步代码,如下所示:

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) throw err;
        done();
      });
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

这究竟是什么意思?我做了console.log(done.toString()),我得到了这个:

function (err) {
  if (err instanceof Error || toString.call(err) === '[object Error]') {
    return done(err);
  }
  if (err) {
    if (Object.prototype.toString.call(err) === '[object Object]') {
      return done(new Error('done() invoked with non-Error: '
        + JSON.stringify(err)));
    }
    return done(new Error('done() invoked with non-Error: ' + err));
  }
  done();
}
Run Code Online (Sandbox Code Playgroud)

这里的done()最后是否与第一段代码中的done()不同?

Lou*_*uis 18

Mocha能够处理同步和异步测试.当您运行同步测试时,您可以将其作为匿名函数传递给it您,而您不必执行任何其他操作:Mocha知道测试在函数返回时结束.但是,如果您正在运行异步测试,则必须告诉Mocha测试是异步的.有两种方法可以做到这一点:

  1. 声明传递给的匿名函数it接受一个参数.Mocha将使用单个参数调用您的匿名函数,该函数必须调用以指示您的测试结束.(此参数done由于传统而被调用.您可以调用它complete,cb或者platypus它也可以正常工作.)如果您在done没有值的情况下调用,则测试成功.对于值,测试是失败的,值应该是Error从中派生的对象或对象Error.

  2. 返回承诺:摩卡将等待承诺得到解决或拒绝.如果已解决,则测试成功.如果被拒绝,则测试失败.

您在执行此操作时看到done.toString()的代码只是Mocha在声明参数时传递给测试的函数的代码.你可以在其中看到我上面提到的一些内容(例如,如果你传递一个参数done应该是一个Error或派生自的Error).其中done还有另一个doneMocha专用的功能.