Sinon: createStubInstance 不存根自己的属性或任何继承的东西

创建于 2021-01-23  ·  3评论  ·  资料来源: sinonjs/sinon

描述错误
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存根提供的类中存在的任何/所有字段。

上下文(请填写以下信息):

  • 库版本: [email protected]
  • 环境:
    macOS 11.1
    节点 15.6.0
    7.4
  • 您正在使用的其他库:
    柴4.2.0
    sinon-chai 3.5.0

编辑:我最初过度简化了上述测试并省略了super() ,但它对 sinon 的行为没有影响。 上面的测试已更正。

Easy Documentation Help wanted

所有3条评论

感谢您提出这个问题。 这里有几个错误或被误解的地方:

  • createStubInstance上的第二个参数没有记录(我什至不知道它😄)。
  • 该文件明确指出

    不调用给定的构造函数。

    因此,它可以用于传递初始参数的假设是行不通的。

  • 此未记录功能的现有实现是这样做的:

    • 如果属性不可覆盖,则抛出,因为它不存在于存根实例上。 这就是你的情况。 尚未调用构造函数,因此您的“成员”属性不存在。

    • 如果给定的覆盖是存根,则用给定的存根替换默认存根(例如{ something: sinon.stub() } )。

    • 否则使默认存根返回给定的属性值(例如{ something: 42 } )。

这显然需要更好的文档,但这不是错误。


如何使您的用例工作:

请注意,您正在从“类”原型创建一个新对象。 您实际上并没有创建类的实例,因为没有调用构造函数。 基本上createStubInstance的返回值与您的类具有相同的接口,所有函数都被替换为存根。 因此,如果您需要此存根实例上的属性,您只需分配它们即可。

感谢您的快速答复!

请注意,您正在从“类”原型创建一个新对象。 您实际上并没有创建类的实例,因为没有调用构造函数。 基本上createStubInstance的返回值与您的类具有相同的接口,所有函数都被替换为存根。 因此,如果您需要此存根实例上的属性,您只需分配它们即可。

在 createStubInstance 中支持它是否值得?

function createStubInstance (…) {
  // …
  return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}

@jshado1当然,我们可以做到。 如果您对此功能感兴趣,欢迎您发送 pull request 🙂

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

lavelle picture lavelle  ·  31评论

anthonygreen picture anthonygreen  ·  23评论

ngerritsen picture ngerritsen  ·  26评论

rvagg picture rvagg  ·  23评论

jonnyreeves picture jonnyreeves  ·  33评论