BeforeAll与BeforeEach。什么时候使用它们?

时间:2019-02-04 13:19:44

标签: javascript unit-testing testing jestjs

我最近正在查看一个同事代码,我意识到他在describe调用顶部的BeforeAll函数中实现了一个jest函数,然后在beforeEach函数中创建了一个数据对象。这让我想知道,BeforeAll和BeforeEach之间到底有什么区别。

是时候了……我去了Google !!我确实找到了一些文章,这些文章有助于阐明两者之间的某些功能差异。

发现1 http://breazeal.com/blog/jasmineBefore.html

发现2 Difference between @Before, @BeforeClass, @BeforeEach and @BeforeAll

考虑到我发现的文章,BeforeAll仅被调用一次。而在每个单独的测试之前调用BeforeEach。太好了!现在,我对何时调用它有了更好的了解!

我还发现,BeforeAll最适合用于初始化代码。这是完全合理的!初始化一次。繁荣,您完成了。

我的困惑是什么时候初始化什么东西,什么时候不初始化?我发现我们代码中的BeforeEach经常被使用。我很好奇的是哪种代码被认为是“初始化”代码,而不是BeforeEach中应该包含什么代码。

下面的代码示例:

    beforeAll((done) => {
      // Mocking method from within Box file
      transferBoxPlanSpy = jest.spyOn(Box, 'transferPlanFromBox').mockImplementation(() => Promise.resolve());

      // Pulling data from MongoDB
      User.findOne({ user_name: 'testsurgeon1' }, (err, user) => {
        user.addMGSPermission();
        user.save(done);
      });
    });

    beforeEach(() => {
      planData2 = {
        user_name: 'hello1',
        laterality: 'right',
        plan_id: 'testplan42',
        order_number: '856-hd-02-l',
        file_id: '123456sbyuidbefui',
      };
    });

我希望我的问题不要太含糊。谢谢您的时间!

编辑1 我想指出的是,这段代码不是我自己编写的,而是由我们软件团队中的一位成员编写的。他将对象放在BeforeEach内部,并将模拟对象放在BeforeAll内部。

我的困惑是,除了少数例外,似乎所有代码都可以放到BeforeAll中。

1 个答案:

答案 0 :(得分:0)

两者均用于设置一项或多项测试所需的条件。

如果您确定测试不会对这些条件进行任何更改,则可以使用beforeAll(它将运行一次)。

如果测试更改了这些条件,则您需要使用beforeEach,它将在每次测试之前运行,因此可以为下一个条件重置条件。

除非初始化缓慢或计算量大,否则默认使用beforeEach可能是最安全的方法,因为它减少了人为错误的机会,即未意识到一个测试正在更改下一个测试的设置。

您显示的示例是结合使用这两个示例的一个很好的例子-缓慢的网络呼叫被放入beforeAll中,因此它只需发生一次;每次在beforeEach中都会重置数据对象(可能是由测试修改的)。