如何在不模拟pg导入的情况下使用Node.js/Jest测试Postgres
我有两个要测试的SQL查询,一个INSERT和一个SELECT。我想运行一个调用insert的测试,然后调用select,它将从insert返回数据如何在不模拟pg导入的情况下使用Node.js/Jest测试Postgres,node.js,postgresql,jestjs,Node.js,Postgresql,Jestjs,我有两个要测试的SQL查询,一个INSERT和一个SELECT。我想运行一个调用insert的测试,然后调用select,它将从insert返回数据 我找到了一个关于模拟postgres的方法,但我想实际运行postgres的测试实例,而不是模拟实际的查询。与postgres的集成测试可能如下所示: const { Pool } = require('pg'); describe('testing postgres', () => { let pgPool; befo
我找到了一个关于模拟postgres的方法,但我想实际运行postgres的测试实例,而不是模拟实际的查询。与postgres的集成测试可能如下所示:
const { Pool } = require('pg');
describe('testing postgres', () => {
let pgPool;
beforeAll(() => {
pgPool = new Pool({
connectionString: process.env.TEST_DATABASE_URL
});
});
afterAll(async () => {
await pgPool.end();
});
it('should test', async () => {
const client = await pgPool.connect();
try {
await client.query('BEGIN');
const { rows } = await client.query('SELECT 1 AS "result"');
expect(rows[0]["result"]).toBe(1);
await client.query('ROLLBACK');
} catch(err) {
throw err;
} finally {
client.release();
}
})
});
您可以将此测试称为:
TEST_DATABASE_URL=postgresql://sth:sth@someserver/testdb jest
可以使用返回*
来测试插入和选择
const { rows } = await client.query('INSERT INTO ... RETURNING *');
使用
BEGIN
和ROLLBACK
是必要的,这样您就不会更改数据库,也不会对下一次测试产生副作用。如果您希望测试一个查询是否确实有效,为什么不直接对实际的数据库进行测试呢?使用docker compose或云中的实例在本地运行一个。如果你想真正知道它是否有效,那么就对它进行适当的测试。如果您正在进行单元测试,请模拟它并确保它按预期工作。不过,您需要在某个阶段针对实际实例进行测试。或者,内存中的实例通常是一件事,我知道MongoDB有一个实例(不确定PSQL),我在API中使用一个客户端,而不是一个池。我也从不显式地调用client.end(),而是有一个侦听器客户端。在('end',()=>{})上,这是一种不好的做法吗?从你的评论很难判断。也许会提出一个新问题?我认为在(web?)api的上下文中使用连接池总是有益的。