【问题标题】:How to mock the connect, query, and release methods of pool in postgreSql using sinon?postgreSql中如何使用sinon模拟pool的connect、query、release方法?
【发布时间】:2021-05-02 13:35:13
【问题描述】:

我有一个函数,我正在执行一些数据库操作。喜欢,

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,但我没有发现它的答案很有帮助。

如果我做错了什么,谁能帮助我。

【问题讨论】:

    标签: node.js unit-testing mocking mocha.js sinon


    【解决方案1】:

    你可以使用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
    ----------|---------|----------|---------|---------|-------------------
    

    【讨论】:

    • 感谢您的回答。这就是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2022-01-04
    • 2015-04-09
    • 2020-08-20
    • 2022-11-14
    • 2017-10-24
    • 2019-03-24
    • 2017-01-20
    相关资源
    最近更新 更多