栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Sinon存根函数用于解构

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Sinon存根函数用于解构

使用从从属模块进行解构时,对模块的方法进行插桩的原因很简单,并且与绑定实际函数引用的时间有关。它与CommonJS模块,Sinn或Node本身没有任何关系,因此我将以简单的Javascript示例开始。

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 destructuringconsole.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());

如果运行上面的示例,您将看到,即使

methodFoo
obj
“模块” 的属性进行了存根,直接绑定的引用仍会返回旧值!

这是因为,在存根时,您实际上是在为对象的属性(此处为

obj
)分配一个新值(一个函数)。对此新值的新引用(使用
obj.methodFoo
)将打印新值,
但是如果您存储了对旧函数的引用,则 在调用旧函数时仍将获得旧的返回值。

同样适用于您的原始问题。如果您在模块A中依赖

foo
于模块B中的函数并 存储了
该引用,那么您是否为导出的值分配了新值(例如存根)都没有关系,因为您已经存储了对B的引用。旧值。

在本质上:

这将受到存根的影响

const A = require('./A');function doFoo(){    A.foo(); // will always evalute  A['foo']()}

这不会受到存根的影响

const myFoo = require('./A').foo;function doFoo(){    myFoo(); // will just evalute to the original value of A.foo()}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号