javascript 'before()'和'beforeEach()`之间的区别是什么?

rkue9o1l  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(234)

Mochabefore()beforeEach()之间的具体区别是什么?(对于after()afterEach(),问题相同。)
我假设before()在每个describe()块中运行一次,beforeEach()在每个测试(it()块)中运行一次。
什么时候我会选择使用其中一个而不是另一个?

brtdzjyr

brtdzjyr1#

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 beforetop beforeEachsublevel beforeEach这个序列感到惊讶,他们认为外部作用域中的所有钩子都应该在内部作用域中的所有钩子之前执行,所以他们期待这个序列:top beforeEachsublevel beforesublevel beforeEach。然而,Mocha执行钩子的顺序是完全有意义的:before钩子用于为一组测试设置阶段,而beforeEach测试用于每个单独的测试。当Mocha执行测试时,在包含该测试的describe中设置的所有beforebeforeEach钩子,并且该describe的所有祖先应用于该测试。Mocha将执行从最外作用域到最内作用域的每个before钩子,以及从最外作用域到最内作用域的所有beforeEach钩子。所有适用的before钩子在任何beforeEach钩子之前执行。这解释了上面的顺序:sublevel beforetop beforeEach之前执行,因为它是before挂接。对于afterafterEach,应用相同的逻辑,但顺序相反:在任何after挂钩之前执行应用的所有afterEach挂钩。
还要注意的是,Mocha并不关心我的it调用相对于顶层describe中的describe调用是如何排序的,它执行top test1top test2和 * 然后 * 子层测试,即使我给出的顺序是top test1,然后是子层测试,然后是top test2
你想在beforebeforeEach等中使用什么,实际上取决于你的测试的细节。如果你需要设置一个模拟对象或数据结构,并且这个对象或结构 * 可以 * 被单个describe中的所有测试重用,你可以使用before来设置它。和after来拆除它。如果您正在对该结构进行只读测试,则可能会出现这种情况。如果所有测试都只读取它,那么就没有必要一遍又一遍地创建它。如果你的describe中的每个测试都需要一个结构的 * 新 * 副本,因为每个测试都在 * 修改 * 结构,那么您应该使用beforeEach为每个测试重新创建结构,如果您需要彻底地将其拆除,则使用afterEach。这样做可以确保测试隔离:每个测试从已知状态开始,并且不依赖于先前测试是否成功。

eqqqjvef

eqqqjvef2#

执行测试用例时调用一次before()Hardhat.

&& beforeEach()块每次在测试用例Hardhat. #hardhat #ethereum

中执行时执行
我对两个函数都使用了相同的东西,你可以看到它们之间的区别...

相关问题