我试图确保在我所有的Jest测试运行之后,我的应用程序被正确销毁,但是我在尝试使用Jest的全局拆解配置值时遇到了一些非常奇怪的行为。
这里是情况:我的应用创建了数据库连接。它也有一个destroy
方法,其关闭数据库连接。这行得通。
我有一个测试可以启动服务器,对数据库连接运行查询。在我的全球拆卸功能,我请app.destroy()
,但过程挂起。
如果我在全局拆解函数中注释掉destroy
调用并在查询后将app.destroy()
放入测试中,则Jest不会像预期的那样挂起并关闭。我还可以将afterAll(() => app.destroy())
放入测试文件中,然后一切正常。
这是我的jest.config.js
module.exports = {
testEnvironment: 'node',
roots: [
'<rootDir>/src'
],
transform: {
'^.+\\.tsx?$': 'ts-jest'
},
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
moduleFileExtensions: [
'ts',
'tsx',
'js',
'jsx',
'json',
'node'
],
globalSetup: '<rootDir>/src/testSetup.ts',
globalTeardown: '<rootDir>/src/testTeardown.ts'
};
这是测试(目前是应用程序中唯一的测试):
import app from '../..';
describe('User router', () => {
it('Should respond with an array of user objects', async () => {
await app.models.User.query();
});
});
这是<rootDir>/src/testTeardown.ts
中的全局拆卸:
import app from './index';
module.exports = async function testTeardown() {
await app.destroy();
};
使用上面的代码,该过程在测试完成后挂起。我试着加入console.log
到testTeardown
和测试结束,并将日志出现在正确的顺序:测试日志,然后拆卸日志。但是,如果我将app.destroy()
移至测试中,则效果很好:
import app from '../..';
describe('User router', () => {
it('Should respond with an array of user objects', async () => {
await app.models.User.query();
await app.destroy();
});
});
这也有效:
import app from '../..';
afterAll(() => app.destroy());
describe('User router', () => {
it('Should respond with an array of user objects', async () => {
await app.models.User.query();
});
});
为什么会这样?
同样,为了解决问题,我尝试在测试中设置global._app
,然后在拆解处理程序中进行检查,但这是undefined
。做玩笑的安装/拆卸功能,甚至可以在同一个进程中运行测试?
答案 0 :(得分:1)
否,最好的globalSetup和globalTeardown文件不一定在与测试相同的过程中运行。这是因为jest使您的测试并行化并在一个单独的过程中运行每个测试文件,但是对于一组组合的测试文件,只有一个全局设置/拆卸阶段。
您可以使用setupFiles
添加一个文件,该文件将与每个测试文件一起运行。在setupFiles
文件中,您可以放置:
afterAll(() => app.destroy());
您的笑话配置仅仅是
module.exports = {
testEnvironment: 'node',
roots: [
'<rootDir>/src'
],
transform: {
'^.+\\.tsx?$': 'ts-jest'
},
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
moduleFileExtensions: [
'ts',
'tsx',
'js',
'jsx',
'json',
'node'
],
setupFiles: ['<rootDir>/src/testSetup.ts']
};