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

JS测试:使用Sinon时如何伪造其他文件方法的API响应

问题解答

可以在MainCreator测试用例的beforeEach生命周期钩子中完成外部方法的桩替换,不需要修改现有业务代码即可拦截真实API请求。

实现原理

makeIndents方法中通过new HeaderCreator()生成的实例,调用getHeaderCreds时本质是沿原型链查找HeaderCreator.prototype上的方法,只要在实例化前替换原型上的原方法,所有后续生成的实例调用该方法时都会走桩逻辑,不会执行原方法内的fetch网络请求。

具体实现代码

import sinon from 'sinon';
// 导入待测试类和外部依赖类
import { MainCreator } from './MainCreator.js';
import { HeaderCreator } from './Headers.js';

describe('MainCreator 测试', () => {
  let getHeaderCredsStub;

  beforeEach(() => {
    // 替换原型上的getHeaderCreds方法,返回预设的测试假数据
    // 因为原方法是async函数,这里用resolves返回Promise格式的假值
    getHeaderCredsStub = sinon.stub(HeaderCreator.prototype, 'getHeaderCreds').resolves({
      // 此处替换为你测试需要的模拟results数据即可
      credential: 'test_mock_value',
      expireTime: 1735689600
    });
  });

  afterEach(() => {
    // 测试结束后还原原方法,避免桩逻辑污染其他测试用例
    getHeaderCredsStub.restore();
  });

  it('makeIndents 执行时不会触发真实网络请求', () => {
    const mainCreator = new MainCreator();
    mainCreator.makeIndents();

    // 可选:断言方法被正常调用
    sinon.assert.calledOnce(getHeaderCredsStub);
  });
});

其他可选方案

如果你需要做更彻底的模块级隔离,也可以搭配对应测试框架的模块mock能力(比如Vitest的vi.mock、Jest的jest.mock、CommonJS环境下的proxyquire)直接替换整个HeaderCreator类,但上述原型打桩的方案最轻量,无额外依赖,只要能在测试文件中导入HeaderCreator构造函数即可生效,完全适配你当前的代码结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:09:22