eri*_*oco 78 javascript unit-testing mocha.js
什么具体的区别是摩卡的before()和beforeEach()?(同样的问题after()和afterEach().)
我假设before()每个describe()块beforeEach()运行一次,每次测试运行一次(it()块).真的吗?
什么时候我会选择使用另一个?
Lou*_*uis 164
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");
});
});
Run Code Online (Sandbox Code Playgroud)
你会看到类似的东西(我省略了不相关的输出):
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
Run Code Online (Sandbox Code Playgroud)
如果你看看之前和之后每个在分段测试的执行什么可奇怪的事情是,双方将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如果您需要将其彻底拆除.这样做可确保测试隔离:每个测试都从已知状态开始,并且不依赖于先前测试的存在与否来成功.