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)
这是单元测试解决方案:
\n\ndbConn.js:
const mysql = require("mysql2/promise");\n\nasync function getPool(options = {}) {\n return await mysql.createPool(optionsClone);\n}\n\nmodule.exports = {\n getPool,\n};\nRun Code Online (Sandbox Code Playgroud)\n\ngetEmployees.js:
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};\nRun Code Online (Sandbox Code Playgroud)\n\ngetEmployees.test.js:
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});\nRun 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----------------------|----------|----------|----------|----------|-------------------|\nRun Code Online (Sandbox Code Playgroud)\n\n源代码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/59346368
\n