【问题标题】:How do you test Postgres with Node.js / Jest without mocking the pg import如何在不模拟 pg 导入的情况下使用 Node.js / Jest 测试 Postgres
【发布时间】:2020-08-26 11:20:55
【问题描述】:

我有 2 个要测试的 SQL 查询,一个 INSERT 和一个 SELECT。我想运行一个调用插入的测试,然后调用 select,它应该从插入返回数据。

我发现了一个关于模拟 postgres 的 stackoverflow post,但我想实际运行一个 postgres 测试实例,而不是模拟实际查询。

【问题讨论】:

  • 如果您要测试一个查询是否真正有效,为什么不直接针对实际数据库进行测试呢?使用 docker-compose 或云中的实例在本地运行一个。如果您想真正知道它是否有效,请正确测试它。如果您正在进行单元测试,请模拟它并确保它按预期工作。不过,您需要在某个阶段针对真实实例对其进行测试。或者,内存中的实例通常是一个东西,我知道 MongoDB 存在一个(不确定 PSQL)

标签: node.js postgresql jestjs


【解决方案1】:

使用 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

可以使用RETURNING * 来测试插入和选择。

     const { rows } = await client.query('INSERT INTO ... RETURNING *');

使用 BEGINROLLBACK 是必要的 - 这样您就不会更改数据库并且对下一次测试有副作用。

【讨论】:

  • 我在我的 API 中使用单个客户端而不是池。我也从不明确调用 client.end() 而是有一个监听器 client.on('end', ( )=>{ }) 这是不好的做法吗?
  • 很难从您的评论中看出。也许创建一个新问题?我认为在(Web?)API 的上下文中使用连接池总是有益的。 node-postgres.com/features/pooling.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2017-09-27
  • 1970-01-01
  • 2023-04-09
  • 2018-05-07
  • 2016-07-12
  • 2022-11-17
相关资源
最近更新 更多