基于Node.js、Azure Functions与SQL的应用如何开展单元测试
你完全可以使用 mocha + chai 组合完成你提到的两个测试场景,以下是可直接落地的实现方案:
前置准备
- 安装测试依赖:
npm install mocha chai sinon --save-dev
- 在 package.json 的 scripts 节点中添加测试命令:
"test": "mocha ./tests/*.test.js"
测试用例编写
1. 数据库连接功能测试
可以单独测试数据库操作文件中的startDb方法,验证数据库连接逻辑是否正常:
const { expect } = require('chai'); const db = require('../你的数据库文件路径'); describe('数据库连接测试', () => { // 测试正常配置下的连接 it('应该可以正常建立SQL数据库连接', async () => { let connectError = null; try { await db.startDb(); } catch (err) { connectError = err; } expect(connectError).to.be.null; }); // 也可以用sinon模拟错误配置,验证异常捕获逻辑是否符合预期 });
2. 新用户创建功能测试
这里可以通过 mock 数据库的insert方法,验证注册接口的逻辑正确性,避免污染真实业务数据:
const { expect } = require('chai'); const sinon = require('sinon'); const registerFunction = require('../你的Azure Function入口文件路径'); const db = require('../你的数据库文件路径'); describe('注册接口测试', () => { let mockContext; // 每次测试前初始化mock上下文 beforeEach(() => { mockContext = { log: sinon.spy(), res: {} }; // mock数据库连接和插入方法 sinon.stub(db, 'startDb').resolves(); sinon.stub(db, 'insert').resolves(); }); // 每次测试后还原mock对象 afterEach(() => { sinon.restore(); }); it('POST请求携带正确参数时应该返回创建成功', async () => { const mockReq = { method: 'POST', body: { username: 'testUser', email: 'test@test.com', password: 'test123' } }; await registerFunction(mockContext, mockReq); expect(mockContext.res.status).to.be.undefined; // 未显式设置status时默认是200 expect(mockContext.res.body).to.deep.equal(['succes']); expect(db.insert.calledOnceWith(mockReq.body)).to.be.true; }); it('数据库插入失败时应该返回400状态码和错误信息', async () => { const mockError = new Error('用户名重复'); db.insert.rejects(mockError); const mockReq = { method: 'POST', body: { username: 'existUser', email: 'exist@test.com', password: 'test123' } }; await registerFunction(mockContext, mockReq); expect(mockContext.res.status).to.equal(400); expect(mockContext.res.body).to.equal(mockError.message); }); });
额外提示
- 如果需要做全链路的集成测试,可以单独申请测试用的SQL实例,每次测试执行完成后清空测试数据即可,不需要修改现有业务逻辑
- 你当前的前端代码存在两处需要修正的问题:
- 成功判断逻辑写为了赋值操作
if(data[0] = "succes"),需要改为全等判断if(data[0] === "succes") - 接口返回的成功标识拼写为
succes,少了一个s,建议统一修正为success避免后续逻辑出错
- 成功判断逻辑写为了赋值操作
内容的提问来源于stack exchange,提问作者Greatdane14
相关产品推荐
相关产品推荐

