Mocha的before()
和beforeEach()
之间的区别是什么? (after()
和afterEach()
的问题相同。)
我假设before()
每个describe()
块运行一次,beforeEach()
每个测试运行一次(it()
块)。这是真的吗?
我何时会选择使用其中一个?
答案 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 beforeEach
,sublevel beforeEach
,top beforeEach
感到惊讶。他们认为外部作用域中的所有挂钩都应该在内部作用域中的所有挂钩之前执行,因此它们需要序列:sublevel before
,sublevel beforeEach
,before
。但是,Mocha执行钩子的顺序非常有意义:beforeEach
钩子用于为一组测试设置阶段,而before
测试用于每个单独的测试。当Mocha执行测试时,包含它的beforeEach
中设置的所有describe
和describe
挂钩以及before
的所有祖先都适用于测试。 Mocha将执行从最外层范围到最内层的每个beforeEach
挂钩,以及从最外层范围到最里层的所有before
挂钩。 但是,所有应用的beforeEach
挂钩都会在任何sublevel before
挂钩之前执行。这解释了上面的顺序:top beforeEach
在before
之前执行,因为它是after
挂钩。使用afterEach
和afterEach
时,相同的逻辑适用但顺序相反:应用的所有after
挂钩都在任何it
挂钩之前执行。
另请注意,Mocha并不关心我如何在顶级describe
中针对describe
来电订购top test1
来电。它执行top test2
,top test1
和然后次级测试,即使我给出的顺序是top test2
,然后是次级测试,然后是before
您希望在beforeEach
,describe
等中使用的内容实际上取决于您的测试的具体情况。如果您需要设置模拟对象或数据结构,并且单个before
中的所有测试都可以重用 这个对象或结构,您可以使用after
来设置它起来,并describe
将其拆除。如果您对结构进行只读测试,则可能就是这种情况。如果您的所有测试只读取它,那么就不需要反复创建它。如果beforeEach
中的每个测试都需要新结构副本,因为每个测试都修改结构,那么您应该使用afterEach
来创建每个测试重新构建,然后{{1}}如果你需要干净地拆掉它。这样做可确保测试隔离:每个测试都从已知状态开始,并且不依赖于先前测试的存在与否来成功。