使用Sinon存根pg-promise

时间:2019-11-27 03:42:20

标签: javascript node.js express sinon

我正在尝试测试以下使用// m:\Shared is mapped to a shared folder. And it has permissions on the folder. var tmp = @"m:\Shared\tmp.txt"; var target = @"m:\Shared\target.txt"; var backup = @"m:\Shared\backup10.txt"; File.Replace(tmp, target, backup); // Error! 在postgres数据库中进行查询的函数。我将无法对pg-promise函数pg-promise进行存根处理,以使其返回我定义的值,因此我可以编写测试以表明在返回某些数据时它将返回所述数据,并且在{{ 1}}遇到错误,它将发回该错误消息。

下面是一个示例函数

queries.js

db.one

这是一个示例测试

queries.test.js

db.one

当我得到未解决的回报时,我不认为我正确地选择了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= $1', [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) }) }

1 个答案:

答案 0 :(得分:2)

这是单元测试解决方案:

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= $1", [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= $1", ["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= $1", ["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/stackoverflow/59062660