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

