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

使用chai-http测试Node.js接口时如何mock内部调用函数?

解决方案

你需要使用函数mock工具拦截createUser的实际执行,以下是适配你当前Mocha+Chai技术栈的实现方案:

前置条件

确保你的createUser函数是从独立模块导出、再导入到路由文件中使用的,比如你的路由文件存在类似导入逻辑:

// 路由文件顶部
import { createUser } from './services/user.js';

只有独立导出的函数才能被mock工具拦截替换。

实现步骤

1. 安装Sinon.js依赖

Sinon是专门用于JavaScript测试的桩函数、mock工具,执行以下命令安装:
npm install sinon --save-dev

2. 修改测试代码

在测试执行前替换createUser为mock桩函数,测试结束后恢复原函数避免影响其他用例:

import chai from 'chai';
import chaiHttp from 'chai-http';
import sinon from 'sinon';
chai.use(chaiHttp);
import { app } from '../../server';
// 导入createUser所在的模块
import * as userService from '../../services/user.js';

describe('Create user tests', function () {
    let createUserStub;
    // 每个测试用例执行前创建mock桩
    beforeEach(function() {
        // 替换createUser为桩函数,返回模拟的用户数据
        createUserStub = sinon.stub(userService, 'createUser').resolves({
            id: 1,
            name: 'xxxxx',
            email: 'xxx@mail.com'
        });
    });
    // 每个测试用例执行后恢复原函数
    afterEach(function() {
        createUserStub.restore();
    });

    it('user should be created', async function () {
        const res = await chai.request(app)
            .post('/api/v1/user')
            .set({
                'content-type': 'application/json',
            })
            .send({
                name: 'xxxxx',
                email: 'xxx@mail.com',
            });
        res.should.have.status(200);
        // 可选断言:验证createUser被正确调用,且参数符合预期
        createUserStub.calledOnce.should.be.true;
        createUserStub.firstCall.args[0].body.should.deep.equal({
            name: 'xxxxx',
            email: 'xxx@mail.com'
        });
    });
});

注意事项

  • 如果你的项目使用Node原生ES模块(package.json中配置"type": "module"),需要额外安装@sinonjs/esm-proxy或者切换为Jest的ES模块mock能力实现。
  • 如果你使用Jest作为测试运行器,可以直接使用内置的jest.mock方法替换模块导出,无需额外安装Sinon。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:24:03