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

Sinon.js无法mock Node.js net对象 测试报socket.end非函数问题求助

问题原因

你错误地将sinon.mock()返回的Mock控制器对象直接注入给了Canvas构造函数,而非你定义的fakeSocket模拟对象:

  • sinon.mock(fakeSocket)返回的是用来定义调用预期、执行校验的控制器,本身不包含end/destroy等你在fakeSocket上定义的方法,因此Canvas实例拿到的this.socket没有对应方法,触发报错。
  • 你不需要将Mock控制器传递给被测实例,Mock会自动代理你传入的fakeSocket的方法调用校验。

修正后的测试代码

const Canvas = ...
const expect = require("expect");
const sinon = require("sinon");

describe('Canvas', () => {
  const fakeSocket = {
    end: sinon.spy(), // 将空函数替换为sinon spy,支持单独校验调用情况
    destroy: sinon.spy(),
    write: sinon.spy(),
  };

  let canvasObj;
  const mock = sinon.mock(fakeSocket);

  beforeEach(() => {
    // 传入fakeSocket本身,而非mock控制器
    canvasObj = new Canvas(fakeSocket);
  });

  describe("disconnect", () => {
    it("calls the appropriate functions", () => {
      mock.expects("end").once();
      mock.expects("destroy").once();
      
      canvasObj.disconnect();
      
      // sinon的verify已经完成了预期校验,下方的expect可以按需保留
      mock.verify();
      expect(fakeSocket.end.called).toBe(true);
      expect(fakeSocket.destroy.called).toBe(true);
    });
  });
});

额外说明

  • 如果你只用Sinon Mock做校验,不需要额外用expect判断调用情况,mock.verify()会自动检查所有预期是否满足,不满足会直接抛出测试失败的错误。
  • 如果你不需要用Sinon的Mock语义,也可以直接用sinon.spy包裹fakeSocket的方法,直接断言spy的调用情况即可,不需要额外创建Mock控制器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:06:03