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

dav*_*ewy 15 jestjs

我有一个Node.js项目,我正在使用Jest进行测试.我有几个具有相同设置要求的测试文件.以前,所有这些测试都在一个文件中,所以我只有一个beforeAll(...)执行常见设置.现在,将测试分成多个文件,似乎我必须将该beforeAll(...)代码复制/粘贴到每个文件中.这似乎是不优雅的 - 有没有更好的方法来做到这一点,理想情况下,我可以只编写我的beforeAll(...)/设置逻辑一次,并从多个测试文件"需要"它?请注意,我的测试套件中还有其他测试不需要此设置功能,所以我不想让我的所有测试运行此设置(只是测试文件的特定子集).

ada*_*que 15

如果您使用的是Jest> = 20,则可能需要考虑为jest-environment需要此常见设置的测试创建自定义.这将是一个扩展或者一个模块jest-environment-nodejest-environment-jsdom和工具async setup(),async teardown()以及async runScript()为此设置工作.

然后,您可以@jest-environment my-custom-env向需要此设置的文件添加指令.

有关testEnvironment如何设置此内容的详细信息,请参阅Jest配置文档; 那里有一个简单的例子.

  • 但这不适用于跨文件。即使根据他们自己的文档,“注意:TestEnvironment 是沙盒的。每个测试套件将在自己的测试环境中触发设置/拆卸。 (9认同)

Kri*_*ont 15

我为此使用了一个简单的“测试挂钩”模式:

// 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]. /* ... */);
  });
});
Run Code Online (Sandbox Code Playgroud)


Lou*_*eda 14

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

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

在你的jest.config.js

//jest.config.js
module.exports = {
  ...
  testTimeout: 20000,
  globalSetup: "./setup.js"
};
Run Code Online (Sandbox Code Playgroud)

然后创建一个名为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

};
Run Code Online (Sandbox Code Playgroud)

文档

  • 它只能达到一个标准,即在任何测试用例运行之前首先调用,它不能被其他测试文件访问。 (3认同)

Mol*_*Ice 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


nik*_*ita 7

您可以将beforeAll逻辑移至一个文件中并在 jest.config.jssetupFilesAfterEnv部分中引用它:

module.exports = {
...
setupFilesAfterEnv: ['<rootDir>/testHelper.ts'],
...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是在每个测试文件之前,不在测试文件之间共享 (22认同)