使用 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