我有一个 Node.js 项目,正在使用 Jest 进行测试。我有几个具有相同设置要求的测试文件。以前,所有这些测试都在一个文件中,因此我只有一个
beforeAll(...)
来执行常见设置。现在,随着测试分成多个文件,似乎我必须将 beforeAll(...)
代码复制/粘贴到每个文件中。这看起来不太优雅 - 有没有更好的方法来做到这一点,理想情况下我可以只编写我的beforeAll(...)
/设置逻辑一次,并从多个测试文件中“要求”它?请注意,我的测试套件中还有其他测试不需要此设置功能,因此我不想让all我的测试运行此设置(只是测试文件的特定子集)。
如果您使用 Jest >=20,您可能需要考虑为需要此通用设置的测试创建自定义
jest-environment
。这将是一个扩展 jest-environment-node
或 jest-environment-jsdom
的模块,并实现 async setup()
、async teardown()
和 async runScript()
来完成此设置工作。
然后,您可以向需要此设置的文件添加
@jest-environment my-custom-env
指令。
testEnvironment
的 Jest 配置文档;那里有一个简单的例子。
我正在使用一个简单的“测试钩子”模式:
// 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]. /* ... */);
});
});
如果您需要在所有测试文件之前运行脚本,您可以使用
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
};
在某个地方创建一个函数,如下所示:
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
})
})
您可以将
beforeAll
逻辑移至一个文件中,并在 jest.config.js setupFilesAfterEnv
部分中引用它:
module.exports = {
...
setupFilesAfterEnv: ['<rootDir>/testHelper.ts'],
...
}
https://jestjs.io/docs/en/configuration#setupfilesafterenv-array