开玩笑说,在测试完成之前运行全局拆卸吗?

时间:2019-02-01 22:50:08

标签: javascript node.js jestjs

我试图确保在我所有的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.logtestTeardown和测试结束,并将日志出现在正确的顺序:测试日志,然后拆卸日志。但是,如果我将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。做玩笑的安装/拆卸功能,甚至可以在同一个进程中运行测试?

1 个答案:

答案 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']
};