javascript - Javascript nodeJs Postgres pg 单元测试
问题描述
我正在使用PG库连接到 Postgres DB,
现在,我想为数据库访问编写单元测试,但我不知道该怎么做。实际上,我需要一些模拟 Postgres 服务器或其他东西来模拟 Postgres。
我正在使用Mocha进行测试
下面是我访问数据库的课程之一
import { Pool } from "pg";
export class DbAccess implements IdbAccess {
private static readonly postgres = new Pool();
constructor(@inject(TYPES.ILogger) private readonly logger: ILogger) {}
public saveConsumer(consumer: IAPIGWConsumer): Promise<IAPIGWConsumer> {
return this.queryOne`
INSERT INTO users (consumer_id, email)
VALUES (${consumer.consumer_id}, ${consumer.email})
ON CONFLICT (consumer_id) DO UPDATE SET email = ${consumer.email}
RETURNING *
`;
}
}
我会很感激任何帮助,谢谢。
解决方案
如果你想模拟或存根一些包/方法/模块,你需要安装一个模拟/存根库,例如sinon.js
,jest.js
来实现这一点。
这是使用sinon.js
. 为了简单明了,我删除了不必要的部分,例如 DI。
db.ts
:
import { Pool } from "pg";
export class DbAccess {
private static readonly postgres = new Pool();
public saveConsumer(consumer) {
return DbAccess.postgres.query(`
INSERT INTO users (consumer_id, email)
VALUES (${consumer.consumer_id}, ${consumer.email})
ON CONFLICT (consumer_id) DO UPDATE SET email = ${consumer.email}
RETURNING *
`);
}
}
db.test.ts
:
import pg from "pg";
import sinon from "sinon";
import { expect } from "chai";
describe("59624370", () => {
afterEach(() => {
sinon.restore();
});
it("should pass", async () => {
const mPool = { query: sinon.stub().resolves({ rows: [] }) };
const poolStub = sinon.stub(pg, "Pool").callsFake(() => mPool);
const { DbAccess } = require("./db");
const db = new DbAccess();
const consumer = { consumer_id: 1, email: "example@gmail.com" };
const actual = await db.saveConsumer(consumer);
expect(actual).to.be.eql({ rows: [] });
sinon.assert.calledOnce(poolStub);
sinon.assert.calledOnce(mPool.query);
});
});
带有覆盖率报告的单元测试结果:
59624370
✓ should pass (132ms)
1 passing (141ms)
------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
db.test.ts | 100 | 100 | 100 | 100 | |
db.ts | 100 | 100 | 100 | 100 | |
------------|----------|----------|----------|----------|-------------------|
源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/59624370
推荐阅读
- python - 我上传的文件没有保存到数据库
- html - 打开链接时 iOS Chrome 的视口高度不正确(来自 iMessage、Messenger、WhatsApp 等)
- firebase-realtime-database - 如何制定 Firebase 数据库规则,以便您无法查询 root /
- mysql - PHP MySQL将三列随机化在一起?
- xml - T-SQL XML:如果有更多具有相同名称的节点,如何更新一个节点中的值?
- python - 通过四舍五入到最接近的小时从 pandas 数据框中的日期时间列创建一个新列
- c# - Unity在编辑器播放模式下同步加载场景
- android - Google Glass Provisioning - 我在哪里可以找到 QR 码?
- sql - 选择重叠日期的语句
- .net - 使用 couchbase dotnet SDK 3.1 从 iis 联系 couchbase 服务器的问题