node.js - 在打字稿中使用 jest 模拟 postgres 数据库连接(Pool,PoolClient,pg)
问题描述
我有一个从 Postgres 数据库中获取值的简单函数。我需要通过模拟数据库来测试该方法。我尝试了提供的各种方法,但没有一个奏效。总会出现一些错误。我尝试了以下解决方案:
- 如何使用 jest 在 node.js 中模拟 postgresql (pg)
- 如何用 Sinon 模拟 pg Pool
- 使用 ts-jest/utils 模拟数据库 Jest
- 如何在不模拟 pg 导入的情况下使用 Node.js / Jest 测试 Postgres 如何使用 jest 测试 async await pg 连接?
- 如何使用 Jest 模拟 SQL Server 连接池?
- 如何使用 jest 在 node.js 中模拟 postgresql (pg)
以下是我的文件。
数据库.ts
import { Pool } from 'pg'
const pool = new Pool({
user: `${process.env.POSTGRES_USER}`,
database: `${process.env.POSTGRES_DB}`,
password: `${process.env.POSTGRES_PASSWORD}`,
port: `${process.env.POSTGRES_PORT}`,
host: `${process.env.POSTGRES_HOST}`,
})
export default pool;
获取.ts
import pool from "./db";
import {SO} from "./s2l";
export async function fetch(code: string): Promise<SO[]>{
let socalls: SO[] =[]
const sql = 'Select sg.v1,sg.v2,sg.v3,sg.v4 from table1 sg where code = $1 and sg.r_code not in(\'ABC\', \'XYZ\', \'PQR\') order by sg.datetime asc'
const values = [code]
const client = await pool.connect()
await client.query(sql, values).then(res => {
const data = res.rows;
let so
data.forEach(row => {
so ={
service: {
code: row["v1"]
},
rCode: row["v2"],
dVo: row["v3"],
aVo: row["v4"],
};
socalls.push(so)
});
}).catch(e => console.error(e))
.then(() => client.release())
return Promise.all(socalls);
}
另外,我需要动态传递查询中的列表。
解决方案
以下方法对我有用
获取.test.ts
import { fetch } from "./fetch";
import pool from "./db";
describe("Test fetch of so calls from database", () => {
afterAll(() => {
jest.resetAllMocks();
});
it("Happy case", async () => {
(pool as any).connect = jest.fn().mockReturnThis();
(pool as any).query = jest.fn().mockReturnThis();
(pool as any).release = jest.fn().mockReturnThis();
(pool as any).query.mockResolvedValueOnce({
rows: [
{
v2: "EHRBFK76TGSMD",
v3: "355GG",
v4: "355GG",
v1: "Q923892GT",
},
],
});
const result = await fetchSiteCalls("Y2K");
expect(result).toEqual([
{
rCode: "EHRBFK76TGSMD",
dVo: "355GG",
aVo: "355GG",
service: { code: "Q923892GT" },
},
]);
});
});
推荐阅读
- cordova - 如何修复 Ionic 中的“未安装背景模式插件”错误?
- matlab - Matlab中的Polyfit和Polyval
- angular - 如果在 Ionic 4 中选择选项卡,如何更改布局属性?
- git - Git:列出子目录中根目录的过滤路径
- javascript - 在类中使用 requestAnimationFrame
- php - PHP - html 文本的 substr
- python - 因子(x**2+x+1)在 sympy 中不起作用?有什么办法可以找到因素吗?
- eclipse - 从 egit 创建远程存储库
- django - 当 Debug 设置为 False 时,找不到错误 404 引发 500
- spring-boot - 在spring boot中为不同的数据源加载不同的schema.sql和data.sql