Jest beforeAll() 在多个测试文件之间共享

问题描述 投票:0回答:5

我有一个 Node.js 项目,正在使用 Jest 进行测试。我有几个具有相同设置要求的测试文件。以前,所有这些测试都在一个文件中,因此我只有一个

beforeAll(...)
来执行常见设置。现在,随着测试分成多个文件,似乎我必须将
beforeAll(...)
代码复制/粘贴到每个文件中。这看起来不太优雅 - 有没有更好的方法来做到这一点,理想情况下我可以只编写我的
beforeAll(...)
/设置逻辑一次,并从多个测试文件中“要求”它?请注意,我的测试套件中还有其他测试不需要此设置功能,因此我不想让all我的测试运行此设置(只是测试文件的特定子集)。

jestjs
5个回答
40
投票

如果您使用 Jest >=20,您可能需要考虑为需要此通用设置的测试创建自定义

jest-environment
。这将是一个扩展
jest-environment-node
jest-environment-jsdom
的模块,并实现
async setup()
async teardown()
async runScript()
来完成此设置工作。

然后,您可以向需要此设置的文件添加

@jest-environment my-custom-env
指令。

有关如何设置的详细信息,请参阅

testEnvironment
的 Jest 配置文档;那里有一个简单的例子。


16
投票

我正在使用一个简单的“测试钩子”模式:

// This function wraps beforeAll and afterAll into a single RAII-like call.
// That makes the describe code further down easier to read and makes
// sure you don't forget the afterAll part. Can easily be shared between tests.
function useFakeServer() {
  let server;

  beforeAll(() => server = sinon.fakeServer.create());
  afterAll(() => server.restore());
  
  return () => server;
}

describe('Some scenario', () => {
  const getServer = useFakeServer();
  
  it('accesses the server', () => {
    const server = getServer();
    // Test as you normally would..
    expect(server.requests[0]. /* ... */);
  });
});

14
投票

如果您需要在所有测试文件之前运行脚本,您可以使用

globalSetup

此选项允许使用自定义全局设置模块,该模块导出在所有测试套件之前触发一次的异步函数。

在你的

jest.config.js

//jest.config.js
module.exports = {
  ...
  testTimeout: 20000,
  globalSetup: "./setup.js"
};

然后创建一个名为

setup.js

的文件
// setup.js
module.exports = async () => {
    
    console.log("I'll be called first before any test cases run");
    //add in what you need to do here

};

文档


10
投票

在某个地方创建一个函数,如下所示:

export function setupBeforeAndAfter(putParamsHereIfYouHaveAny) {
  beforeAll(() => shared-before-all-code);
  afterAll(() => shared-after-all-code);
  beforeEach(() => shared-before-each-code);
  afterEach(() => shared-after-each-code);
}

然后只需在您本来手动编写这些函数的任何地方调用它即可:

describe('My test', () => {
  setupBeforeAndAfter(putParamsHereIfYouHaveAny)

  it('is amazing', () => {
    // Stuff in setupBeforeAndAfter() will run before/after this test as appropriate
  })
})

7
投票

您可以将

beforeAll
逻辑移至一个文件中,并在 jest.config.js
setupFilesAfterEnv
部分中引用它:

module.exports = {
...
setupFilesAfterEnv: ['<rootDir>/testHelper.ts'],
...
}

https://jestjs.io/docs/en/configuration#setupfilesafterenv-array

© www.soinside.com 2019 - 2024. All rights reserved.