为什么不总是需要使用带有mocha的`done()`回调?

时间:2014-11-19 22:49:08

标签: mocha

在Mocha.js文档中,有3种beforeEach用法示例。

  1. beforeEach(function (done) {...必须运行完成回调,以便Mocha知道挂钩已完成
  2. beforeEach(function () { return promise...返回一个promise,因此不需要回调。
  3. beforeEach(function () {...其中未引用回调未返回承诺。
  4. 其中任何一个本身看起来都不错,但是mocha如何区分case(1)和case(2)和(3)? Mocha如何检测回调是否被定义为传递给beforeEach的参数(案例1),因此需要在继续测试之前调用,而不是传递回调的情况2和3,因此测试可以在beforeEach函数完成后立即开始吗?

1 个答案:

答案 0 :(得分:1)

这很简单,可以通过阅读Mocha的源代码来发现,这就是我刚才所做的。 Mocha所做的是检查传递给beforeEach或任何其他钩子或it的函数是否通过检查函数的length字段来获取参数。以下与Node.js的交互式会话说明了这一点:

> function foo() {}
undefined
> foo.length
0

foo.length为0,因为foo不接受任何参数。

> function bar(done) {}
undefined
> bar.length
1

bar.length为1,因为bar只接受一个参数。

在Mocha中,此测试在Runnable个对象的构造函数中完成:

this.async = fn && fn.length;

每个钩子都被建模为Hook对象,它是Runnable的派生类。每个测试都建模为Test对象,它也是Runnable的派生类。