什么具体的区别是摩卡的before()
和beforeEach()
?(与after()
和的问题相同afterEach()
。)
我假设before()
每个describe()
块beforeEach()
运行一次,每个测试(it()
块)运行一次。真的吗?
我什么时候会选择使用另一个?
Answers:
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 beforeEach
,sublevel beforeEach
。他们认为,在外部范围所有的钩子应该在内部范围内的所有挂钩之前,所以他们期望的顺序执行,: ,top beforeEach
,。sublevel before
sublevel beforeEach
但是,Mocha执行挂接的顺序是完全有意义的:before
挂接旨在为一组测试设置阶段,而一个beforeEach
测试则针对每个单独的测试。当Mocha执行测试时,其中包含的所有before
和beforeEach
钩子以及该测试的所有describe
祖先都将describe
应用于该测试。Mocha将执行before
从最外部的作用域到最内部的每个钩子,以及beforeEach
从最外部的作用域到最内部的所有钩子。然而,所有before
适用的挂钩都会在执行任何beforeEach
挂钩之前执行。这解释了上面的顺序:因为它是一个钩子sublevel before
,top beforeEach
所以之前执行before
。并且使用after
和afterEach
,将应用相同的逻辑,但是顺序相反:所有afterEach
适用的挂钩都在任何after
挂钩之前执行。
还要注意,Mocha不在乎我如何订购it
相对于describe
顶层呼叫的呼叫describe
。它执行top test1
,top test2
并随后将分段测试,即使我一声令下了top test1
,然后分段测试,然后top test2
。
您要在before
,beforeEach
等之间使用的内容实际上取决于测试的细节。如果您需要设置一个模拟对象或数据结构,并且该对象或结构可以在一次测试中被所有测试重用describe
,则可以使用before
它来进行设置并将after
其拆除。如果您正在对该结构执行只读测试,则可能是这种情况。如果您所有的测试都只读取它,那么就不需要一遍又一遍地创建它。如果您的每个测试都describe
需要新的结构副本,因为每个测试都在修改结构,那么您应该使用beforeEach
它为每个测试重新创建结构,然后afterEach
如果您需要将它干净地撕下。这样做可以确保测试隔离:每个测试都从已知状态开始,并且不依赖于先前测试是否存在才能成功。