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

使用Sinon Stub ES6类字段:解决“无法存根不存在的属性”问题

解决ES6类实例字段的Sinon Stub问题

问题根源

你定义的baz = 3是ES6类实例字段,这种语法会在类的构造过程中为每个新实例单独添加baz属性,并不会将其挂载到Foo.prototype上。而Sinon的stub和createStubInstance默认只会识别原型上存在的属性/方法,所以直接操作原型或用createStubInstance时会报错。

具体解决方法

1. 直接Stub实例上的baz

既然baz是实例属性,先创建实例再Stub:

const sinon = require('sinon');
const foo = new Foo();
// 用value()设置Stub后的属性值
sinon.stub(foo, 'baz').value(10);

console.log(foo.baz); // 输出10
console.log(foo.bar()); // 仍为原方法返回值5(若未Stub)

2. 将baz改为原型属性(业务允许时)

如果不需要baz为每个实例独有,可以把它挂载到原型上:

class Foo {
  bar() {
    return 5;
  }
}
// 手动添加原型属性
Foo.prototype.baz = 3;

之后就能直接Stub原型上的baz:

sinon.stub(Foo.prototype, 'baz').value(10);
const foo = new Foo();
console.log(foo.baz); // 输出10

3. 用createStubInstance后手动补充baz

如果必须用createStubInstance生成模拟实例,可在生成后手动添加或Stub该属性:

const stubInstance = sinon.createStubInstance(Foo);

// 方式A:直接赋值
stubInstance.baz = 10;

// 方式B:用sinon.stub为实例添加属性
sinon.stub(stubInstance, 'baz').value(10);

4. 自定义模拟对象

如果需要更灵活的模拟,直接构建包含Stub属性的对象:

const mockFoo = {
  baz: sinon.stub().value(10),
  bar: sinon.stub().returns(7)
};
// 使用时直接传入mockFoo即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:55:12