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
2条答案
按热度按时间brtdzjyr1#
before()
在describe
中的 * 所有 * 测试之前运行一次after()
在describe
中的 * 所有 * 测试后运行一次beforeEach()
在describe
中的 * 每次 * 测试之前运行afterEach()
在describe
中 * 每次 * 测试后运行您想使用哪一个取决于您的实际测试。
现在,详细解释一下,如果你运行
mocha -R min
:您将看到如下内容(我省略了不相关的输出):
如果你看看在子层的每个测试之前和之后执行了什么,你会感到惊讶的是,顶层和子层的
beforeEach
回调都被调用了,afterEach
也是如此。有些人也对
sublevel before
,top beforeEach
,sublevel beforeEach
这个序列感到惊讶,他们认为外部作用域中的所有钩子都应该在内部作用域中的所有钩子之前执行,所以他们期待这个序列:top beforeEach
,sublevel before
,sublevel beforeEach
。然而,Mocha执行钩子的顺序是完全有意义的:before
钩子用于为一组测试设置阶段,而beforeEach
测试用于每个单独的测试。当Mocha执行测试时,在包含该测试的describe
中设置的所有before
和beforeEach
钩子,并且该describe
的所有祖先应用于该测试。Mocha将执行从最外作用域到最内作用域的每个before
钩子,以及从最外作用域到最内作用域的所有beforeEach
钩子。所有适用的before
钩子在任何beforeEach
钩子之前执行。这解释了上面的顺序:sublevel before
在top beforeEach
之前执行,因为它是before
挂接。对于after
和afterEach
,应用相同的逻辑,但顺序相反:在任何after
挂钩之前执行应用的所有afterEach
挂钩。还要注意的是,Mocha并不关心我的
it
调用相对于顶层describe
中的describe
调用是如何排序的,它执行top test1
、top test2
和 * 然后 * 子层测试,即使我给出的顺序是top test1
,然后是子层测试,然后是top test2
。你想在
before
,beforeEach
等中使用什么,实际上取决于你的测试的细节。如果你需要设置一个模拟对象或数据结构,并且这个对象或结构 * 可以 * 被单个describe
中的所有测试重用,你可以使用before
来设置它。和after
来拆除它。如果您正在对该结构进行只读测试,则可能会出现这种情况。如果所有测试都只读取它,那么就没有必要一遍又一遍地创建它。如果你的describe
中的每个测试都需要一个结构的 * 新 * 副本,因为每个测试都在 * 修改 * 结构,那么您应该使用beforeEach
为每个测试重新创建结构,如果您需要彻底地将其拆除,则使用afterEach
。这样做可以确保测试隔离:每个测试从已知状态开始,并且不依赖于先前测试是否成功。eqqqjvef2#
执行测试用例时调用一次before()Hardhat.
&& beforeEach()块每次在测试用例Hardhat. #hardhat #ethereum
中执行时执行
我对两个函数都使用了相同的东西,你可以看到它们之间的区别...