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

如何使用Sinon验证被Stub的Getter方法是否被调用?

如何用Sinon验证Stub的Getter方法是否被调用?

当使用Sinon的createStubInstance创建类实例,再尝试Stub其getter方法并验证调用状态时,会遇到getter行为生效但stub.called始终返回false的问题,示例代码如下:

export class MyClass {
  public method() {
    return 5;
  }

  public get property() {
    return 5;
  }
}

it("stubs getter", () => {
    const myClass = sinon.createStubInstance(MyClass);
    const stub = sinon.stub(myClass, "property").get(() => 10);
    expect(myClass.property).toBe(10); // 验证通过
    expect(stub.called).toBe(true);    // 验证失败
});

问题原因

sinon.createStubInstance会自动为类的所有方法和属性生成stub,但对于getter属性,它生成的是不带完整调用跟踪的基础stub。当你再次调用sinon.stub(myClass, "property")去覆盖getter行为时,虽然能修改返回值,但新的stub引用无法正确关联后续的调用记录,导致called等调用状态验证失效。

解决方案

方案1:使用真实类实例替代createStubInstance

直接创建类的真实实例,再对getter进行Stub,这种方式能保证stub的调用跟踪正常工作:

it("stubs getter correctly", () => {
    const myClass = new MyClass();
    const stub = sinon.stub(myClass, "property").get(() => 10);
    
    expect(myClass.property).toBe(10);
    expect(stub.called).toBe(true); // 验证通过
});

方案2:复用createStubInstance生成的原始Stub

如果必须使用createStubInstance,可以直接获取它为getter生成的原始Stub,修改其getter行为后再验证:

it("stubs getter with stubInstance", () => {
    const myClass = sinon.createStubInstance(MyClass);
    // 获取createStubInstance生成的原始getter stub
    const stub = (myClass as any).stubs.property;
    stub.get(() => 10);
    
    expect(myClass.property).toBe(10);
    expect(stub.called).toBe(true); // 验证通过
});

这种方式避免了重复Stub导致的调用跟踪关联问题,直接复用了createStubInstance生成的带完整调用跟踪的Stub引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:32:17