`before()`和`beforeEach()`有什么区别?

Mocha before()beforeEach()之间的区别是什么? ( after()afterEach()相同的问题。)

我假设before()每个describe()块运行一次,而beforeEach()每个testing( it() block)运行一次。 真的吗?

而我什么时候会select使用一个呢?

简而言之, before一次describe之前的所有testing之前运行一次,之后在一次describe之后的所有testingafter运行一次,而每个testing之前在每个testing之前运行一次描述,之后每次testing之后。 你想使用哪一个取决于你的实际testing。

现在,长期的解释。 如果你在这上面运行mocha -R min

 describe("top", function () { before(function () { console.log("top before"); }); after(function () { console.log("top after"); }); beforeEach(function () { console.log("top beforeEach"); }); afterEach(function () { console.log("top afterEach"); }); it("test1", function () { console.log("top test1"); }); describe("sublevel", function() { before(function () { console.log("sublevel before"); }); after(function () { console.log("sublevel after"); }); beforeEach(function () { console.log("sublevel beforeEach"); }); afterEach(function () { console.log("sublevel afterEach"); }); it("test1", function () { console.log("sublevel test1"); }); it("test2", function () { console.log("sublevel test2"); }); }); it("test2", function () { console.log("top test2"); }); }); 

你会看到类似的东西(我省略了不相关的输出):

 top before top beforeEach top test1 top afterEach top beforeEach top test2 top afterEach sublevel before top beforeEach sublevel beforeEach sublevel test1 sublevel afterEach top afterEach top beforeEach sublevel beforeEach sublevel test2 sublevel afterEach top afterEach sublevel after top after 

如果你看一下在子层面上的每个testing之前和之后执行什么的话,可能会令人惊讶的是,顶层和beforeEachcallback都被调用。 同样的事情afterEach

有些人还惊讶于top beforeEach的次序, top beforeEach sublevel beforetop beforeEach sublevel beforeEach 。 他们认为外部范围中的所有钩子都应该在内部范围内的所有钩子之前执行,因此他们期望序列:在每一个sublevel beforetop beforeEachtop beforeEachsublevel before sublevel beforeEach sublevel before 。 但是,Mocha执行钩子的顺序非常有意义: before钩子是为一组testing设置阶段,而beforeEachtesting是针对每个单独的testing。 当Mocha执行一个testing时,在包含它的describe中设置的beforebeforeEach挂钩以及describe所有祖先都适用于testing。 摩卡将执行每个从最外层的范围到最内层的钩子,以及从最外层的范围到最内层的所有的beforeEach钩子。 但是before应用之前的所有钩子都在beforeEach钩子之前执行。 这就解释了上面的命令: top beforeEach sublevel before执行,因为它是一个before钩子。 并且after afterEach ,同样的逻辑适用,但是顺序是相反的:所有应用after所有钩子都after钩子之前执行。

另外请注意,摩卡并不关心我是如何命令我的相对于顶级describe describe调用的调用。 它执行top test1top test2和subleveltesting,即使我给的命令是top test1 ,然后是子级testing,然后是top test2

beforebefore要使用什么,等等,真的取决于你的testing的细节。 如果你需要设置一个模拟对象或数据结构,并且这个对象或者结构可以被所有的testing重复使用,你可以使用before的设置,然后把它拆下来。 如果您正在对结构进行只读testing,则可能是这种情况。 如果你所有的testing只读取它,那么就没有必要一遍又一遍地创build它。 如果您的describe每个testing都需要一个的结构副本,因为每个testing都在修改结构,那么您应该使用beforeEach为每个testing重新创build一个结构,然后在每个testing之后重新创build结构,如果需要afterEach干净的话。 这样做可以确保testing隔离:每个testing都从一个已知的状态开始,而不依赖于以前的testing是否成功。