done()callback的要点是什么?

在Mochajs中,他们使用“done()”来testingasynchronous代码,如下所示:

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(); }); }); }); }); 

这是什么意思? 我做了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(); } 

这里的done()在第一段代码中与done()不同吗?

摩卡能够处理同步和asynchronoustesting。 当你运行一个同步testing的时候,你可以把它作为一个匿名函数传递给it ,你不需要做任何事情:当函数返回时,Mocha知道testing结束。 但是, 如果您正在运行asynchronoustesting,则必须告诉Mochatesting是asynchronous的。 有两种方法可以做到这一点:

  1. 声明传递给it的匿名函数需要一个参数。 摩卡会用一个参数来调用你的匿名函数,这个函数是你必须调用的函数来表示你的testing结束了。 (这个参数被称为传统,你可以称它为completecbplatypus ,它的工作原理也是一样的)。如果你调用没有值的方法,testing就成功了。 对于一个值,testing是失败的,值应该是Error对象或派生自Error的对象。

  2. 回报一个承诺:摩卡将等待承诺解决或拒绝。 如果解决,testing是成功的。 如果被拒绝,testing失败。

当你做done.toString()时,你看到的代码只是当你声明一个参数的时候,Mocha传递给你的testing的代码。 你可以看到上面提到的一些东西(例如,如果你传递一个参数来done它应该是一个Error或从Error派生)。 在那里done另一个function是摩卡私有的。

由于node.js的asynchronous性质,你必须告诉Mocha你已经完成了testing。

对于传统的同步语言,当方法完成后,就完成了。 但是在节点中,首先执行整个方法,然后执行user.save()内部主体。

摩卡只是等待testing,直到done()被调用,因为它没有任何其他选项来查找是否应该执行其他的事情或者完成。

你所拥有的输出只是function的主体。

所有的testing用例,包括before(),after(),beforeEach(),afterEach()都必须调用done()来告诉mocha所有的任务完成。

如果done()丢失,超时exception将发生,因为摩卡将等待“done()”,直到超时。

Interesting Posts