【问题标题】:Jest run async function ONCE before all testsJest 在所有测试之前运行一次异步函数
【发布时间】:2018-01-01 02:39:31
【问题描述】:

我想使用 jest 进行服务器单元测试(而不是 mocha+chai)。 有没有一种方法可以在所有测试开始(初始化目的)之前运行异步函数一次而不是每个测试文件?还有,是否有办法在所有测试完成后运行某些东西?

【问题讨论】:

    标签: javascript jestjs


    【解决方案1】:

    当你使用beforeAll函数在describe块之外然后给它分配async关键字就变得很容易了。

    注意:我在这里使用的是 jest @27.4.3 版本

    代码示例

    import { getValuesFromAWSSecretManager } from '../../src/libs/secret_manager';
    import quickbooksConfigFrom from '../../src/config/quickbooks';
    
    const quickbooksConfig = quickbooksConfigFrom;
    
    // calling the async beforeALL function to get values from AWS Secret Manager
    beforeAll(async () => {
      const secretData = await getValuesFromAWSSecretManager();
      quickbooksConfig.clientId = secretData.QUICKBOOKS_CLIENT_ID;
      quickbooksConfig.clientSecret = secretData.QUICKBOOKS_CLIENT_SECRET;
    });
    
    describe('Quickbooks config file should be defined', () => {
      test('Quickbooks File should be exist', () => {
        expect(quickbooksConfig).toBeDefined();
      });
    
      test('Quickbooks File should be exist and having values', () => {
        expect(quickbooksConfig).toBeTruthy();
      });
    });
    

    希望它能帮助并解决您的疑问,

    您可能需要在每个文件中都这样做才能申请。

    你可以先查看 jest beforeAll 文档from here

    【讨论】:

      【解决方案2】:

      此功能是在Jest's 22 version 中添加的,具有globalSetupglobalTeardown 配置。 看看this的例子。

      package.json(或jest.config.js

      {
        ...
        "jest": {
          "globalSetup": "./scripts/jestGlobalSetup.js"
        }
      }
      

      /scripts/jestGlobalSetup.js

      module.exports = async () => {
        console.log('\nhello, this is just before tests start running');
      };
      

      export default async () => {
        console.log('\nhello, this is just before tests start running');
      };
      

      【讨论】:

        【解决方案3】:

        jest 在新版本中为全局设置和拆卸提供了选项。您可以为导出异步函数的设置和拆卸创建文件,并像这样在开玩笑的配置中提供该路径。

        "globalSetup": "setup-file-path",
        "globalTeardown": "tear-down-file-path"
        

        您可以进一步阅读here

        【讨论】:

        • 由于不包含指向源参考的链接而被否决。
        【解决方案4】:

        Jest 提供beforeAllafterAll。与test/it 一样,如果函数返回一个promise,它将等待promise 解决。

        beforeAll(() => {
          return new Promise(resolve => {
            // Asynchronous task
            // ...
            resolve();
          });
        });
        

        如果你有一些使用回调的现有测试代码,它也支持回调样式,尽管建议使用 Promise。

        beforeAll(done => {
          // Asynchronous task
          // ...
          done();
        });
        

        【讨论】:

        • Jest beforeAll 听起来很棒,尤其是回复:Promises “如果函数返回一个 Promise 或者是一个生成器,Jest 在运行测试之前等待该 Promise 解决。”茉莉花有同等的吗?看起来 Jasmine 支持 Promises,但 does support a done callback approach? 我专门使用 Protractor,但 done 回调对我不起作用 as described here
        • 我在哪里可以找到声明它可以在beforeAll 中使用done() 的文档?我只能发现它在等待promise
        • 好答案,但不满足要求的“只有一次,而不是每个测试文件”。
        • 这个答案是错误的,每个测试文件都会发生一次
        【解决方案5】:

        如果您使用 npm 执行 jest 测试,您可以在执行其他命令之前运行任何节点命令或任何可执行文件

        "scripts": {
            "test": "node setup.js && jest"
          }
        

        所以现在你可以用命令来运行它

        $ npm t
        

        【讨论】:

        • 谢谢,但我正在寻找 Jest 解决方案。就像 Mocha 允许您将 BeforeAll 放在全局范围内,我希望 Jest 也有类似的东西。
        • 虽然这个解决方案没问题,但它不会在--watch 模式下运行。有什么 Jest 解决方案吗?
        • 这个答案已经过时了
        猜你喜欢
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        相关资源
        最近更新 更多