gpt4 book ai didi

javascript - `before()` 和 `beforeEach()` 有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 02:49:09 25 4
gpt4 key购买 nike

Mocha之间具体有什么区别?的 before()beforeEach()? (after()afterEach() 的相同问题。)

我假设 before() 每个 describe() block 运行一次,而 beforeEach() 每个测试运行一次(它() block )。是真的吗?

我什么时候会选择使用一个而不是另一个?

最佳答案

before()all describe
测试之前运行一次after()所有 describe
测试之后运行一次beforeEach()describe
中的each 测试之前运行afterEach()describe

中的 each 测试之后运行

具体使用哪一个,要看你的实际测试情况。

现在,进行详细的解释。如果您对此运行 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 beforetop beforeEachsublevel beforeEach 的顺序感到惊讶。他们认为外部作用域中的所有钩子(Hook)应该在内部作用域中的所有钩子(Hook)之前执行,所以他们期望序列:top beforeEach, sublevel before, 子级别 beforeEach。然而,Mocha 执行 Hook 的顺序是完全合理的:before Hook 旨在为一组测试设置阶段,而 beforeEach 测试则针对每个个人测试。当 Mocha 执行测试时,在包含它的 describe 中设置的所有 beforebeforeEach 钩子(Hook),以及它的所有祖先describe 适用于测试。 Mocha 会执行从最外层作用域到最内层的每个 before 钩子(Hook),以及从最外层作用域到最内层的所有 beforeEach 钩子(Hook)。 但是,应用的所有before Hook 都在任何beforeEach Hook 之前执行。这解释了上面的顺序:sublevel beforetop beforeEach 之前执行,因为它是一个 before Hook 。对于 afterafterEach,适用相同的逻辑,但顺序相反:所有适用的 afterEach Hook 在任何 之前执行在钩子(Hook)之后。

另请注意,Mocha 不关心我如何排序我的 it 调用相对于顶层 describe 中的 describe 调用。它执行 top test1top test2then 子级测试,即使我给出的命令是 top test1 ,然后是子级测试,然后是 top test2

你想在 beforebeforeEach 等中使用什么实际上取决于你的测试的细节。如果您需要设置一个模拟对象或数据结构,并且该对象或结构可以被单个describe中的所有测试重用,您可以使用before 进行设置,after 将其拆除。如果您对结构进行只读测试,可能会出现这种情况。如果你所有的测试都只读取它,那么就没有必要一遍又一遍地创建它。如果您的describe 中的每个测试都需要结构的 副本,因为每个测试都在修改 结构,那么您应该使用beforeEach 为每个测试重新创建结构,然后 afterEach 如果您需要彻底拆除它。这样做可确保测试隔离:每个测试都从已知状态开始,并且不依赖于前一个测试是否成功。

关于javascript - `before()` 和 `beforeEach()` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com