如何使用Jasmine或第三方lib在node.js中模拟postgresql(pg)



我有一个方法,可以查询postgres数据库(node-postgres-lib(,从中检索数据并将其映射到平面数组中。

export const getActiveUsersLast7DaysForProject = async (projectId: string): Promise<User[]> => {
let userIds: string[] = [];
const client = new PG.Client(config.encryptedCredentials); // prod only
await client.connect();
await client
.query(
'
SELECT user_id FROM my_db.users_active ua
WHERE ua.project_id='12345'
GROUP BY user_id'
)
.then(
(res: any) => (userIds = res.rows.flatMap((user: any) => user.user_id))
)
.catch((e: Error) => console.error(e.stack));
return userIds;
};

我该如何测试它?当前测试在尝试本地连接到数据库时失败(正如预期的那样,因为凭据不适用于localhost(。我可以存根/模拟query()以返回一些测试查询结果吗?

或者,如何拦截对真实数据库的调用并使用模拟数据库,例如pg-mem

您可以使用spyOn()模拟PG.Client类,并使用jasmine.createSpyObj()PG.Client类的实例创建spy-obj。

注意:通过模拟查询结果进行测试并不能保证SQL语句是正确的,只测试应用程序代码。

这是单元测试、存根副作用I/O操作。

index.ts:

import PG from 'pg';
const config = {
encryptedCredentials: {
host: 'my.database-server.com',
port: 5334,
user: 'database-user',
password: 'secretpassword!!',
},
};
export const getActiveUsersLast7DaysForProject = async (projectId: string): Promise<string[]> => {
let userIds: string[] = [];
const client = new PG.Client(config.encryptedCredentials);
await client.connect();
await client
.query(
`
SELECT user_id FROM my_db.users_active ua
WHERE ua.project_id='12345'
GROUP BY user_id`,
)
.then((res: any) => (userIds = res.rows.flatMap((user: any) => user.user_id)))
.catch((e: Error) => console.error(e.stack));
return userIds;
};

index.test.ts:

import { getActiveUsersLast7DaysForProject } from './';
import PG, { Client } from 'pg';
describe('69830430', () => {
it('should pass', async () => {
const mClient: jasmine.SpyObj<Client> = jasmine.createSpyObj('client', ['connect', 'query']);
mClient.query.and.resolveTo({ rows: [{ user_id: '1' }, { user_id: '2' }] });
spyOn(PG, 'Client').and.returnValue(mClient);
const actual = await getActiveUsersLast7DaysForProject('1');
expect(actual).toEqual(['1', '2']);
expect(mClient.connect).toHaveBeenCalled();
expect(mClient.query).toHaveBeenCalled();
});
});

测试结果:

Executing 1 defined specs...
Running in random order... (seed: 89766)
Test Suites & Specs:
1. 69830430
✔ should pass (6ms)
>> Done!

Summary:
👊  Passed
Suites:  1 of 1
Specs:   1 of 1
Expects: 3 (0 failures)
Finished in 0.013 seconds

最新更新