Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 之前对之前。什么时候使用它们?_Javascript_Unit Testing_Testing_Jestjs - Fatal编程技术网

Javascript 之前对之前。什么时候使用它们?

Javascript 之前对之前。什么时候使用它们?,javascript,unit-testing,testing,jestjs,Javascript,Unit Testing,Testing,Jestjs,我最近查看了一个同事的代码,发现他在descripe调用顶部的BeforeAll函数中实现了一个jest函数,然后在beforeach函数中创建了一个数据对象。这让我想知道,BeforeAll和beforeach到底有什么区别 是时候。。。我去谷歌了!!我确实找到了一些文章,帮助阐明了两者之间的一些功能差异 调查结果1: 调查结果2: 鉴于我发现的文章,BeforeAll被称为一次且仅一次。而beforeach是在每个单独的测试之前调用的。太棒了!我现在更清楚什么时候叫它了 我还发现Before

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

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

调查结果1

调查结果2

鉴于我发现的文章,BeforeAll被称为一次且仅一次。而beforeach是在每个单独的测试之前调用的。太棒了!我现在更清楚什么时候叫它了

我还发现BeforeAll最适合用于初始化代码。这很有道理!初始化它一次。轰,你完了

我的困惑是什么时候初始化了,什么时候没有初始化?我发现,在我们的代码中,beforeach的使用频率比beforeach高。我好奇的是,什么样的代码被认为是“初始化”代码,而不是beforeach中应该包含的任何代码

下面是我们代码中的一个示例:

    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 我想指出,这段代码不是我自己写的,而是我们软件团队中的一位成员写的。他把对象放在beforeach中,把mock放在beforeach中


我的困惑是,似乎所有的代码都可以放在前面,只有少数例外。

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

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

如果测试确实对这些条件进行了更改,那么您需要在每次测试之前使用
,它将在每次测试之前运行,以便为下一次测试重置条件

除非初始化速度慢或计算成本高,否则最好在每次
之前默认使用
,因为这样可以减少人为错误的机会,即没有意识到一个测试正在改变下一个测试的设置


您展示的示例是将两者结合使用的一个很好的示例——慢速网络调用在
之前就被放入了,因此它只需要发生一次;每次在
之前

完美的解释中,数据对象(可能被测试修改)都会被重置!现在这更有意义了。我忘记了数据结构可以更改,从而允许在每次测试之前重置beforeach。谢谢大家!@技术上,你可以接受这个答案。