如何解决如何使用sinon模拟postgreSql中pool的connect、query、release方法?
const { Pool } = require("pg");
const pool = new Pool({
connectionString: `some connection string...`,});
var fun = async function (pk_name,pk_value) {
try {
const db = await pool.connect();
const query = `SELECT *
FROM creds
WHERE ${pk_name} = $1`;
var res = await db.query(query,[pk_value]);
db.release();
return res.rows;
} catch (ex) {
return [];
}
};
module.exports.isValidUser = async function (pk_name,pk_value,password) {
try {
var userData = await fun(pk_name,pk_value);
return userData[0].email === pk_value && userData[0].password === password;
} catch (ex) {
return false;
}
};
我正在尝试模拟上述方法,例如 pool.connect()
、db.query()
和 db.release()
所以,我尝试了以下内容
var sinon = require("sinon");
var assert = sinon.assert;
const { Pool } = require("pg");
const pool = new Pool()
var databaseControllerTestPositive = function () {
it("valid user check test",async function () {
sinon.stub(logUtils,"info");
sinon.stub(pool,'connect')
sinon.stub(pool,'query').returns({
email: "demo@gmail.com",password: "demo"
})
sinon.stub(pool.prototype.connect,"release");
// isValidUser is another function which calls the above fun() internally.
var result = await dbutils.isValidUser(
"fake_pk_name","fake_pk_value","pass"
);
assert.match(result,{ rows: [] });
});
};
但是,上面的测试失败了,我试图模拟的方法并没有真正被模拟。
我发现了一个类似的 question,但我觉得它的答案并没有那么有用。
如果我做错了什么,任何人都可以帮助我。
解决方法
您可以使用 Link Seams,因此我们需要一个额外的包 - proxyquire。由于 fun
函数未导出,因此我们无法直接对其进行要求和测试。我们需要和 isValidUser
函数一起测试。
例如
main.js
:
const { Pool } = require('pg');
const pool = new Pool({
connectionString: `some connection string...`,});
var fun = async function (pk_name,pk_value) {
try {
const db = await pool.connect();
const query = `SELECT *
FROM creds
WHERE ${pk_name} = $1`;
var res = await db.query(query,[pk_value]);
db.release();
return res.rows;
} catch (ex) {
return [];
}
};
module.exports.isValidUser = async function (pk_name,pk_value,password) {
try {
var userData = await fun(pk_name,pk_value);
return userData[0].email === pk_value && userData[0].password === password;
} catch (ex) {
return false;
}
};
main.test.js
:
const proxyquire = require('proxyquire');
const sinon = require('sinon');
var assert = sinon.assert;
describe('65940805',() => {
it('valid user check test',async function () {
const res = { rows: [{ email: 'fake_pk_value',password: 'pass' }] };
const dbStub = {
query: sinon.stub().resolves(res),release: sinon.stub(),};
const poolInstanceStub = {
connect: sinon.stub().resolves(dbStub),};
const PoolStub = sinon.stub().returns(poolInstanceStub);
const dbUtils = proxyquire('./main',{
pg: {
Pool: PoolStub,},});
var result = await dbUtils.isValidUser('fake_pk_name','fake_pk_value','pass');
assert.match(result,true);
sinon.assert.calledWithExactly(PoolStub,{
connectionString: `some connection string...`,});
sinon.assert.calledOnce(poolInstanceStub.connect);
sinon.assert.calledWithExactly(dbStub.query,sinon.match.string,['fake_pk_value']);
sinon.assert.calledOnce(dbStub.release);
});
});
单元测试结果:
65940805
√ valid user check test (1013ms)
1 passing (1s)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 86.67 | 100 | 100 | 86.67 |
main.js | 86.67 | 100 | 100 | 86.67 | 17,26
----------|---------|----------|---------|---------|-------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。