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


90

什么具体的区别是摩卡before()beforeEach()?(与after()和的问题相同afterEach()。)

我假设before()每个describe()beforeEach()运行一次,每个测试(it()块)运行一次。真的吗?

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

Answers:


188

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 beforeEach,。sublevel before sublevel beforeEach但是,Mocha执行挂接的顺序是完全有意义的:before挂接旨在为一组测试设置阶段,而一个beforeEach测试则针对每个单独的测试。当Mocha执行测试时,其中包含的所有beforebeforeEach钩子以及该测试的所有describe祖先都将describe应用于该测试。Mocha将执行before从最外部的作用域到最内部的每个钩子,以及beforeEach从最外部的作用域到最内部的所有钩子。然而,所有before适用的挂钩都会在执行任何beforeEach挂钩之前执行。这解释了上面的顺序:因为它是一个钩子sublevel beforetop beforeEach所以之前执行before。并且使用afterafterEach,将应用相同的逻辑,但是顺序相反:所有afterEach适用的挂钩都在任何after挂钩之前执行。

还要注意,Mocha不在乎我如何订购it相对于describe顶层呼叫的呼叫describe。它执行top test1top test2随后将分段测试,即使我一声令下了top test1,然后分段测试,然后top test2

您要在beforebeforeEach等之间使用的内容实际上取决于测试的细节。如果您需要设置一个模拟对象或数据结构,并且该对象或结构可以在一次测试中被所有测试重用describe,则可以使用before它来进行设置并将after其拆除。如果您正在对该结构执行只读测试,则可能是这种情况。如果您所有的测试都只读取它,那么就不需要一遍又一遍地创建它。如果您的每个测试都describe需要的结构副本,因为每个测试都在修改结构,那么您应该使用beforeEach它为每个测试重新创建结构,然后afterEach如果您需要将它干净地撕下。这样做可以确保测试隔离:每个测试都从已知状态开始,并且不依赖于先前测试是否存在才能成功。


1
太好了谢谢。我的问题部分是什么,原因是什么,这尤其是读/写之间的区别。
ericsoco 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.