使用 Sinon 存根 pg-promise
Stubbing pg-promise using Sinon
我正在尝试测试以下使用 pg-promise
在 postgres 数据库上进行查询的函数。我将无法对 pg-promise
函数 db.one
进行存根,使其 return 成为我定义的值,因此我可以编写测试来显示 return 一些数据它发回所述数据,当 db.one
遇到错误时,它发回该错误消息。
下面是一个示例函数
queries.js
const pgp = require('pg-promise')({noLocking:true});
const config = {
...
};
const db = pgp(config);
function getFaculty(req, res, next) {
db.one('SELECT * FROM users WHERE first_name= ', [req.query.firstName])
.then((data)=> {
let user = {
firstName: data.first_name,
lastName: data.last_name,
phoneNum: data.phone_number
}
return res.status(200).send(user)
})
.catch((err)=>{
console.log(err.message);
return next(err)
})
}
这里是一个例子测试
queries.test.js
const db = require('../routes/queries');
const assert = require('assert');
let sinon = require('sinon')
let pgp = sinon.stub().returns({
one: sinon.stub().returns({
firstName: "Josh",
lastName: "Stevens",
phoneNum: "1234567"
}),
any: sinon.stub(),
none: sinon.stub()
})
describe('test queries', ()=>{
it('Succesfully test getFaculty query', ()=>{
let req = {
query: {
firstName: 'Josh'
}
};
let expectedRes = {
firstName: "Josh",
lastName: "Stevens",
phoneNum: "1234567"
}
let res = db.getFaculty(req)
assert(res, expectedRes)
})
})
我认为我没有正确地删除 pg-promise
,因为我得到了一个未解决的问题 return。
单元测试解决方案如下:
queries.js
:
const pgp = require("pg-promise")({ noLocking: true });
const config = {};
const db = pgp(config);
function getFaculty(req, res, next) {
return db
.one("SELECT * FROM users WHERE first_name= ", [req.query.firstName])
.then((data) => {
let user = {
firstName: data.first_name,
lastName: data.last_name,
phoneNum: data.phone_number,
};
return res.status(200).send(user);
})
.catch((err) => {
console.log(err.message);
return next(err);
});
}
exports.getFaculty = getFaculty;
exports.db = db;
queries.test.js
:
const { getFaculty, db } = require("./queries");
const sinon = require("sinon");
describe("queries", () => {
afterEach(() => {
sinon.restore();
});
it("should get faculty", async () => {
const mReq = { query: { firstName: "Lin" } };
const mRes = { status: sinon.stub().returnsThis(), send: sinon.stub() };
const mNext = sinon.stub();
const mData = { first_name: "Lin", last_name: "Du", phone_number: 123 };
const oneStub = sinon.stub(db, "one").resolves(mData);
await getFaculty(mReq, mRes, mNext);
sinon.assert.calledWith(mRes.status, 200);
sinon.assert.calledWith(mRes.send, { firstName: "Lin", lastName: "Du", phoneNum: 123 });
sinon.assert.calledWith(oneStub, "SELECT * FROM users WHERE first_name= ", ["Lin"]);
});
it("should call error handler middleware", async () => {
const mReq = { query: { firstName: "Lin" } };
const mRes = { status: sinon.stub().returnsThis(), send: sinon.stub() };
const mNext = sinon.stub();
const mError = new Error("connect error");
const oneStub = sinon.stub(db, "one").rejects(mError);
await getFaculty(mReq, mRes, mNext);
sinon.assert.calledWith(mNext, mError);
sinon.assert.calledWith(oneStub, "SELECT * FROM users WHERE first_name= ", ["Lin"]);
});
});
100% 覆盖率的单元测试结果:
queries
✓ should get faculty
connect error
✓ should call error handler middleware
2 passing (11ms)
-----------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-----------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
queries.js | 100 | 100 | 100 | 100 | |
queries.test.js | 100 | 100 | 100 | 100 | |
-----------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/59062660
我正在尝试测试以下使用 pg-promise
在 postgres 数据库上进行查询的函数。我将无法对 pg-promise
函数 db.one
进行存根,使其 return 成为我定义的值,因此我可以编写测试来显示 return 一些数据它发回所述数据,当 db.one
遇到错误时,它发回该错误消息。
下面是一个示例函数
queries.js
const pgp = require('pg-promise')({noLocking:true});
const config = {
...
};
const db = pgp(config);
function getFaculty(req, res, next) {
db.one('SELECT * FROM users WHERE first_name= ', [req.query.firstName])
.then((data)=> {
let user = {
firstName: data.first_name,
lastName: data.last_name,
phoneNum: data.phone_number
}
return res.status(200).send(user)
})
.catch((err)=>{
console.log(err.message);
return next(err)
})
}
这里是一个例子测试
queries.test.js
const db = require('../routes/queries');
const assert = require('assert');
let sinon = require('sinon')
let pgp = sinon.stub().returns({
one: sinon.stub().returns({
firstName: "Josh",
lastName: "Stevens",
phoneNum: "1234567"
}),
any: sinon.stub(),
none: sinon.stub()
})
describe('test queries', ()=>{
it('Succesfully test getFaculty query', ()=>{
let req = {
query: {
firstName: 'Josh'
}
};
let expectedRes = {
firstName: "Josh",
lastName: "Stevens",
phoneNum: "1234567"
}
let res = db.getFaculty(req)
assert(res, expectedRes)
})
})
我认为我没有正确地删除 pg-promise
,因为我得到了一个未解决的问题 return。
单元测试解决方案如下:
queries.js
:
const pgp = require("pg-promise")({ noLocking: true });
const config = {};
const db = pgp(config);
function getFaculty(req, res, next) {
return db
.one("SELECT * FROM users WHERE first_name= ", [req.query.firstName])
.then((data) => {
let user = {
firstName: data.first_name,
lastName: data.last_name,
phoneNum: data.phone_number,
};
return res.status(200).send(user);
})
.catch((err) => {
console.log(err.message);
return next(err);
});
}
exports.getFaculty = getFaculty;
exports.db = db;
queries.test.js
:
const { getFaculty, db } = require("./queries");
const sinon = require("sinon");
describe("queries", () => {
afterEach(() => {
sinon.restore();
});
it("should get faculty", async () => {
const mReq = { query: { firstName: "Lin" } };
const mRes = { status: sinon.stub().returnsThis(), send: sinon.stub() };
const mNext = sinon.stub();
const mData = { first_name: "Lin", last_name: "Du", phone_number: 123 };
const oneStub = sinon.stub(db, "one").resolves(mData);
await getFaculty(mReq, mRes, mNext);
sinon.assert.calledWith(mRes.status, 200);
sinon.assert.calledWith(mRes.send, { firstName: "Lin", lastName: "Du", phoneNum: 123 });
sinon.assert.calledWith(oneStub, "SELECT * FROM users WHERE first_name= ", ["Lin"]);
});
it("should call error handler middleware", async () => {
const mReq = { query: { firstName: "Lin" } };
const mRes = { status: sinon.stub().returnsThis(), send: sinon.stub() };
const mNext = sinon.stub();
const mError = new Error("connect error");
const oneStub = sinon.stub(db, "one").rejects(mError);
await getFaculty(mReq, mRes, mNext);
sinon.assert.calledWith(mNext, mError);
sinon.assert.calledWith(oneStub, "SELECT * FROM users WHERE first_name= ", ["Lin"]);
});
});
100% 覆盖率的单元测试结果:
queries
✓ should get faculty
connect error
✓ should call error handler middleware
2 passing (11ms)
-----------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-----------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
queries.js | 100 | 100 | 100 | 100 | |
queries.test.js | 100 | 100 | 100 | 100 | |
-----------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/59062660