描述错误
createStubInstance
忽略自己的属性,并且在超类上,对其继承的方法和属性视而不见
再现
class SubTest {
name;
constructor({ name }) { this.name = name }
something() {}
}
export default class SuperTest extends SubTest {
description;
constructor(...props) {
super(props);
this.description = props.description;
}
noop() {}
}
import sinon from 'sinon';
import SuperTest from './SuperTest.js';
sinon.createStubInstance(SuperTest, {
description: 'Lorem Ipsum',
name: 'Foobar',
noop() {},
something() {},
});
Error: Cannot stub description. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
注释掉description: 'Lorem Ipsum',
:
Error: Cannot stub name. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
在注释掉name: 'Foobar',
:
Error: Cannot stub something. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
覆盖中只有noop() {}
,它可以工作。
预期行为
我希望createStubInstance
存根提供的类中存在的任何/所有字段。
上下文(请填写以下信息):
编辑:我最初过度简化了上述测试并省略了super()
,但它对 sinon 的行为没有影响。 上面的测试已更正。
感谢您提出这个问题。 这里有几个错误或被误解的地方:
createStubInstance
上的第二个参数没有记录(我什至不知道它😄)。该文件明确指出
不调用给定的构造函数。
因此,它可以用于传递初始参数的假设是行不通的。
{ something: sinon.stub() }
)。{ something: 42 }
)。这显然需要更好的文档,但这不是错误。
如何使您的用例工作:
请注意,您正在从“类”原型创建一个新对象。 您实际上并没有创建类的实例,因为没有调用构造函数。 基本上createStubInstance
的返回值与您的类具有相同的接口,所有函数都被替换为存根。 因此,如果您需要此存根实例上的属性,您只需分配它们即可。
感谢您的快速答复!
请注意,您正在从“类”原型创建一个新对象。 您实际上并没有创建类的实例,因为没有调用构造函数。 基本上
createStubInstance
的返回值与您的类具有相同的接口,所有函数都被替换为存根。 因此,如果您需要此存根实例上的属性,您只需分配它们即可。
在 createStubInstance 中支持它是否值得?
function createStubInstance (…) {
// …
return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}
@jshado1当然,我们可以做到。 如果您对此功能感兴趣,欢迎您发送 pull request 🙂