【问题标题】:BeforeAll vs. BeforeEach. When to use them?BeforeAll 与 BeforeEach。什么时候使用它们?
【发布时间】:2019-06-28 05:54:31
【问题描述】:

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

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

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

发现 2Difference 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 中,将 mock 放在 BeforeAll 中。

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

【问题讨论】:

    标签: javascript unit-testing testing jestjs


    【解决方案1】:

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

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

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

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

    您展示的示例是结合使用两者的一个很好的例子——慢速网络调用放在beforeAll,所以它只需要发生一次;并且每次在beforeEach 中都会重置数据对象(可能是由测试修改的)。

    【讨论】:

    • 完美解释!这现在更有意义了。我忘记了可以更改数据结构,从而允许在每次测试之前重置 BeforeEach。谢谢!
    • @TechnicalViking 你可以接受答案。
    • 我还需要使用beforeAll()吗?将它放在describe 中不也可以吗?
    • 没有。 describe 只是将相关测试组合在一起,它不能替代beforeAll()
    【解决方案2】:

    我知道这是一篇旧帖子,但如果其他人来看我想添加一些重要信息,我很惊讶这里没有提到:

    beforeAll 专门用于需要在运行测试之前完成的 ASYNCHRONOUS 调用。

    在原始帖子中,beforeAll 函数是多余的,因为它不返回承诺 - 你可以简单地将函数体放在你的第一个 describetest 之前

    查看笑话文档:https://jestjs.io/docs/setup-teardown

    在某些情况下,您只需在文件开头进行一次设置。当设置是异步的时,这可能特别麻烦,因此您不能内联。 Jest 提供了 beforeAll 和 afterAll 来处理这种情况。

    例如以下返回一个承诺,它将在测试继续运行之前解决。

    beforeAll(() => {
      return initializeCityDatabase();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多