【问题标题】:why the stubbed functions does not works when using destructor with sinon js?为什么使用带有 sinon js 的析构函数时存根函数不起作用?
【发布时间】:2019-10-27 11:47:14
【问题描述】:

很多人在使用destructor时遇到stubing functions with sinon.js的问题,Sinon stub function used with destructuring有一个很好的解释。 正如答案中提到的,在使用析构函数时,我们总是调用原始函数:

const stub = (o, method) => (o[method] = () => "I am a stub");

const obj = {
  methodFoo() {
    return "I am foo";
  }
};

// same as doing `const methodFoo = obj.methodFoo;`
const { methodFoo } = obj; // "import" using destructuring

console.log("obj.methodFoo(): ", obj.methodFoo());
console.log("methodFoo()", methodFoo());

console.log("Stubbing out method!");
stub(obj, "methodFoo");

console.log("obj.methodFoo: ", obj.methodFoo());
console.log("methodFoo()", methodFoo());

我搜索了一个答案,为什么 destructor 会覆盖 stub 或者它如何在后台工作以了解如何操作数据,但我没有得到任何解决方案。有没有关于这个问题的详细信息?

【问题讨论】:

  • JavaScript 使用 by value 分配/复制。 const { methodFoo } = obj;obj.methodFoo 具有的值的副本分配给methodFoo,这是对函数的引用。之后,对obj.methodFoo 的任何更改都不会影响变量methodFoo。不过,这并不是特定于解构的。这就是 JS 中赋值、变量和值的工作方式。这是一个简单得多的例子:var obj = {foo() { console.log('foo'); }; var method = obj.foo; obj.foo = () => console.log('bar'); method();
  • @FelixKling 非常感谢。

标签: javascript node.js ecmascript-6 destructuring


【解决方案1】:

存根会覆盖方法属性。如果你举这个人为的例子:

 const obj = { prop: "value" };

 const prop = obj.prop; // or { prop } = obj;

 obj.prop = "new value"; // stub()

 console.log(prop); // "value"

那么它可能会变得更清晰。将方法视为可以复制的值(实际上是对它们的引用被复制)。

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 2019-03-06
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多