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

时间:2014-01-28 22:48:19

标签: javascript unit-testing mocha

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

我假设before()每个describe()块运行一次,beforeEach()每个测试运行一次(it()块)。这是真的吗?

我何时会选择使用其中一个?

1 个答案:

答案 0 :(得分:149)

before()所有 describe中的测试之前运行一次 在所有 after()中的测试后,describe运行一次 beforeEach()describe的每个测试之前运行afterEach()describe

中的每次测试之后运行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

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

beforeEach

如果你看看在子级别的每个测试之前和之后执行的内容可能会令人惊讶的是两个顶级和子级的afterEach回调叫做。 sublevel before也是如此。

有些人对序列top beforeEachsublevel beforeEachtop beforeEach感到惊讶。他们认为外部作用域中的所有挂钩都应该在内部作用域中的所有挂钩之前执行,因此它们需要序列:sublevel beforesublevel beforeEachbefore。但是,Mocha执行钩子的顺序非常有意义:beforeEach钩子用于为一组测试设置阶段,而before测试用于每个单独的测试。当Mocha执行测试时,包含它的beforeEach中设置的所有describedescribe挂钩以及before的所有祖先都适用于测试。 Mocha将执行从最外层范围到最内层的每个beforeEach挂钩,以及从最外层范围到最里层的所有before挂钩。 但是,所有应用的beforeEach挂钩都会在任何sublevel before挂钩之前执行。这解释了上面的顺序:top beforeEachbefore之前执行,因为它是after挂钩。使用afterEachafterEach时,相同的逻辑适用但顺序相反:应用的所有after挂钩都在任何it挂钩之前执行。

另请注意,Mocha并不关心我如何在顶级describe中针对describe来电订购top test1来电。它执行top test2top test1然后次级测试,即使我给出的顺序是top test2,然后是次级测试,然后是before

您希望在beforeEachdescribe等中使用的内容实际上取决于您的测试的具体情况。如果您需要设置模拟对象或数据结构,并且单个before中的所有测试都可以重用 这个对象或结构,您可以使用after来设置它起来,并describe将其拆除。如果您对结构进行只读测试,则可能就是这种情况。如果您的所有测试只读取它,那么就不需要反复创建它。如果beforeEach中的每个测试都需要结构副本,因为每个测试都修改结构,那么您应该使用afterEach来创建每个测试重新构建,然后{{1}}如果你需要干净地拆掉它。这样做可确保测试隔离:每个测试都从已知状态开始,并且不依赖于先前测试的存在与否来成功。