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
相关产品推荐
相关产品推荐

