如何使用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
相关产品推荐
相关产品推荐

