You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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实例,每次测试执行完成后清空测试数据即可,不需要修改现有业务逻辑
  • 你当前的前端代码存在两处需要修正的问题:
    1. 成功判断逻辑写为了赋值操作if(data[0] = "succes"),需要改为全等判断if(data[0] === "succes")
    2. 接口返回的成功标识拼写为succes,少了一个s,建议统一修正为success避免后续逻辑出错

内容的提问来源于stack exchange,提问作者Greatdane14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 08:06:06