Mocha的before()
和beforeEach()
到底有什么区别?( after()
和afterEach()
也有同样的问题。)
我假设before()
对每个describe()
块运行一次,而beforeEach()
对每个测试(it()
块)运行一次。这是真的吗?
什么时候我会选择使用一个而不是另一个?
发布于 2014-01-29 07:35:32
before()
在describe
中的所有测试之前运行一次
在describe
中执行完所有测试后,after()
将运行一次
在describe
中的每个测试之前都会运行beforeEach()
在describe
中的每个测试之后都会运行afterEach()
您想要使用哪一个取决于您的实际测试。
现在,进行冗长的解释。如果您在下面的代码上运行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执行测试时,在包含它的describe
中设置的所有before
和beforeEach
挂钩,以及该describe
的所有祖先都将应用于该测试。beforeEach
将从最外面的作用域到最里面的作用域执行每个before
挂钩,并从最外面的作用域到最里面的作用域执行所有Mocha挂钩。但是,所有适用的before
挂钩都是在任何beforeEach
挂钩之前执行的。这解释了上面的顺序:sublevel before
在top beforeEach
之前执行,因为它是一个before
钩子。对于after
和afterEach
,同样的逻辑也适用,但是顺序颠倒了:所有适用的afterEach
钩子都在任何after
钩子之前执行。
还要注意,Mocha并不关心我如何相对于顶层describe
中的describe
调用对我的it
调用进行排序。它执行top test1
,top test2
,然后是子级别测试,即使我给出的命令是top test1
,然后是子级别测试,然后是top test2
。
您想要在before
、beforeEach
等中使用什么,实际上取决于您的测试的具体情况。如果您需要设置一个模拟对象或数据结构,并且此对象或结构可以由单个describe
中的所有测试重用,则可以使用before
来设置它,使用after
来拆卸它。如果您正在对结构进行只读测试,则可能会出现这种情况。如果您的所有测试都只读取它,那么就没有必要一遍又一遍地创建它。如果您的describe
中的每个测试都需要一个新的结构副本,因为每个测试都在修改结构,那么您应该使用beforeEach
为每个测试重新创建结构,如果需要彻底拆分它,则使用afterEach
。这样做可以确保测试隔离:每个测试都从一个已知的状态开始,并且不依赖于前一个测试的存在或不存在才能成功。
https://stackoverflow.com/questions/21418580
复制相似问题