Sinon单元测试MySQL连接

jba*_*ugh 2 javascript mysql unit-testing sinon aws-lambda

我正在尝试对我的 AWS Node Lambda 进行单元测试。我正在使用MySQL。我有一个实用程序文件来获取 MySQL 连接池,它是我的处理程序中的依赖项。我正在尝试通过 Mocha 和 Sinon 对我的处理程序进行单元测试。我想存根或模拟数据库池和连接(没有实际创建数据库连接或访问数据库),但我没有任何运气。有谁知道如何实现这一目标?我创建了以下 2 个文件作为测试工具:

dbConn.js

const mysql = require('mysql2/promise');

async function getPool(options = {}) {
  return await mysql.createPool(optionsClone);
}

module.exports = {
  getPool
};
Run Code Online (Sandbox Code Playgroud)

getEmployees.js

const database = require('./dbConn');

exports.handler = async function(event, context, callback) {
  // Connect to a database via connection pool
  let pool = await database.getPool(dbOptions);
  let conn = await pool.getConnection();

  const dbResult = await conn.query('select * from employees');

  conn.release();

  return dbResult;
};
Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 5

这是单元测试解决方案:

\n\n

dbConn.js:

\n\n
const mysql = require("mysql2/promise");\n\nasync function getPool(options = {}) {\n  return await mysql.createPool(optionsClone);\n}\n\nmodule.exports = {\n  getPool,\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

getEmployees.js:

\n\n
const database = require("./dbConn");\n\nexports.handler = async function(event, context, callback) {\n  const dbOptions = {};\n  let pool = await database.getPool(dbOptions);\n  let conn = await pool.getConnection();\n\n  const dbResult = await conn.query("select * from employees");\n\n  conn.release();\n\n  return dbResult;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

getEmployees.test.js:

\n\n
const { handler } = require("./getEmployees.js");\nconst database = require("./dbConn");\nconst sinon = require("sinon");\nconst { expect } = require("chai");\n\ndescribe("getEmployees", () => {\n  afterEach(() => {\n    sinon.restore();\n  });\n  it("should pass", async () => {\n    const connStub = { query: sinon.stub().resolves({ rowCount: 1 }), release: sinon.stub() };\n    const poolStub = { getConnection: sinon.stub().resolves(connStub) };\n    sinon.stub(database, "getPool").resolves(poolStub);\n    const actual = await handler();\n    expect(actual).to.be.eql({ rowCount: 1 });\n    sinon.assert.calledWith(database.getPool, {});\n    sinon.assert.calledOnce(poolStub.getConnection);\n    sinon.assert.calledWith(connStub.query, "select * from employees");\n    sinon.assert.calledOnce(connStub.release);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

带有覆盖率报告的单元测试结果:

\n\n
  getEmployees\n    \xe2\x9c\x93 should pass\n\n\n  1 passing (13ms)\n\n----------------------|----------|----------|----------|----------|-------------------|\nFile                  |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |\n----------------------|----------|----------|----------|----------|-------------------|\nAll files             |    96.43 |        0 |       80 |    96.43 |                   |\n dbConn.js            |    66.67 |        0 |        0 |    66.67 |                 4 |\n getEmployees.js      |      100 |      100 |      100 |      100 |                   |\n getEmployees.test.js |      100 |      100 |      100 |      100 |                   |\n----------------------|----------|----------|----------|----------|-------------------|\n
Run Code Online (Sandbox Code Playgroud)\n\n

源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/59346368

\n