如何在不模拟pg导入的情况下使用Node.js/Jest测试Postgres

如何在不模拟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

我有两个要测试的SQL查询,一个INSERT和一个SELECT。我想运行一个调用insert的测试,然后调用select,它将从insert返回数据


我找到了一个关于模拟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的上下文中使用连接池总是有益的。