在使用Jest进行所有测试之后,我该如何在Node.js中关闭pg-promise连接?

7

我需要在 Jest 测试函数后关闭 PG-Promise 数据库连接。

它在一个地方(db.js)初始化,并且在需要的每个地方都被 require。在下面的代码中,它被 seed.js 所需,而 seed.spec.js 正在测试它。

我知道 Jest 中有一个 afterAll 钩子,但那会关闭所有连接,可能会导致测试不正确地失败?

这个问题可以通过使用 --forceExit 选项来解决,但它会给出错误消息,感觉不是正确的解决方法?

db.js:

const pgp = require('pg-promise')();
const db = pgp(connection);

module.exports = {db, pgp};

seed.spec.js:

require('dotenv').config();
const {pgp} = require('./db');

expect.extend(require('jest-json-schema').matchers);

const schema = require('./schemas');
const generate = require('./generate');
const seed = require('./seed');
const data = generate();

test ('the data returned by the seed function matches the schema', () => {
  return seed(data)
    .then(outputData => {
      expect(outputData).toMatch(schema);
    });
});

附注:我已经看到了类似的问题,但没有一个完全符合我的情况。


“但这将在所有地方关闭连接,这可能会导致测试错误地失败。” - 我不确定你的意思。它将在当前套件中关闭连接。这对于运行程序正常退出是必要的。 - Estus Flask
@estus 好的,我明白了,但问题在于一开始只有一个地方打开了一个连接。如果要这样做,我真的需要为每个测试套件打开一个新连接,然后在结束时关闭它,然后使所有测试同步运行... 我真正需要的是某种 afterAllTestSuites() 钩子。 - James Wilson
你对 Jest 的概念理解有误。每个文件都是不同的测试套件,它们在并行的不同进程中运行,因此会有几个数据库连接。afterAll 就是它字面意思的含义。 - Estus Flask
是的,afterAll 没有起作用 - 它一直卡在等待连接超时的状态。如果它不起作用,我会删除我的回答 :) - James Wilson
实际上...现在似乎又不起作用了,我不确定为什么!我将尝试按照您建议的在每个测试文件中创建一个新实例。 - James Wilson
显示剩余2条评论
2个回答

8
与任何其他数据库一样,在 afterAll 中应该关闭连接。
根据参考文献,可以使用 pgp.end()db.$pool.end()
afterAll(db.$pool.end);

更新

从pg-promise v10.11.0版本开始,您不再需要显式关闭连接池。相反,您只需设置连接选项allowExitOnIdle: true,使进程在连接池处于空闲状态时退出。


我需要在每个规范文件上都这样做吗?还是有一种全局设置的方法? - Jonathan
有一种全局处理的方法,https://jestjs.io/docs/en/configuration#setupfiles-array。但是这种方法不适用于此情况,因为设置文件和规范之间没有共享上下文,需要将db连接公开为全局变量。并非每个测试套件都涉及db,因此在每个规范文件中执行此操作可能更好。在这种特定情况下,可以通过创建测试助手模块来使事情变得DRY,该模块包装db.js并添加相应的`afterAll`,并使用它而不是db.js。 - Estus Flask

1
我找到的最接近这个问题的解决方案是使用 setupFilesAfterEnv Jest配置选项
// jest.config.js
module.exports = {
    setupFilesAfterEnv: ['./jest/setup/afterAll']
}

// afterAll.js (path: ./jest/setup/afterAll.js)
const { db } = require('../../src/db')

afterAll(db.$pool.end)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接