首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >` the ()`和` `beforeEach()`有什么区别?

` the ()`和` `beforeEach()`有什么区别?
EN

Stack Overflow用户
提问于 2014-01-29 06:48:19
回答 1查看 70.7K关注 0票数 98

Mochabefore()beforeEach()到底有什么区别?( after()afterEach()也有同样的问题。)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-29 07:35:32

before()describe中的所有测试之前运行一次

describe中执行完所有测试后,after()将运行一次

describe中的每个测试之前都会运行beforeEach()

describe中的每个测试之后都会运行afterEach()

您想要使用哪一个取决于您的实际测试。

现在,进行冗长的解释。如果您在下面的代码上运行mocha -R min

代码语言:javascript
复制
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");
    });
});

您将看到类似如下的内容(我省略了不相关的输出):

代码语言:javascript
复制
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的所有祖先都将应用于该测试。beforeEach将从最外面的作用域到最里面的作用域执行每个before挂钩,并从最外面的作用域到最里面的作用域执行所有Mocha挂钩。但是,所有适用的before挂钩都是在任何beforeEach挂钩之前执行的。这解释了上面的顺序:sublevel beforetop beforeEach之前执行,因为它是一个before钩子。对于afterafterEach,同样的逻辑也适用,但是顺序颠倒了:所有适用的afterEach钩子都在任何after钩子之前执行。

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

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

票数 210
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21418580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档