ChatGPT解决这个技术问题 Extra ChatGPT

Proxyquire、rewire、SandboxedModule 和 Sinon:优点和缺点

在模拟 Node 依赖项时,我遇到了以下库:

代理查询

重新布线

沙盒模块

诗乃

它们似乎都在做或多或少相同的事情:允许你模拟 require() 调用(除了模拟几乎所有东西的 Sinon)。它们似乎都需要一些非常精细的设置,注意传递给 require 的字符串的确切语法——在重构期间不是很好。

每个图书馆的优缺点是什么?我什么时候会选择其中之一?每个库都擅长的示例用例是什么?这个领域还有哪些更好的产品?


R
Rob Bednark

这完全感觉像是在作弊,但由于没有其他人回答这个问题,所以这里是:

Proxyquire 接管 require 并允许您在依赖链中的任何位置注入假货。对于您不接管的要求和您未定义的方法要求您接管,它将回退到原始状态。这可以通过 noCallThru 禁用。因此它仍然加载原始内容,只是用您定义的内容替换内容。与 Rewire 和 SandboxedModule 不同,你不能为你的 require 重载定义全局变量。

Rewire 接管 require 并将 __get__ 和 __set__ 属性注入每个模块。如果您知道私有变量名称,则可以替换它。想想依赖注入。

SandboxedModule 几乎与 Proxyquire 相同,只是它在新的 V8 虚拟机中运行整个过程。 (这种方法有每次测试的性能成本。)它在 v 1.0 中还有一个讨厌的错误,当您没有替换的东西引用它不支持的本机模块时,它会失败。请参阅 https://github.com/robrich/sandboxed-module-graceful-fs。

Sinon 并没有像其他 3 那样接管 require。相反,它是一个更传统的 mocking 框架。用假货替换指定的方法,或创建一个模拟,以跟踪它何时被调用。


完全不作弊 - 自我回答很棒!
您是否知道“每次测试的性能成本”有多重要?或者有人做过性能测试吗?我们用的是 SandboxedModule,看起来很慢。我以前使用过 proxyquire 并且喜欢它。想知道是否值得开发人员进行切换。
我没有在它们之间运行性能测试,但是我将代码库从 Sandboxed 转换为 Proxyquire(以绕过 v1.0 错误)并且意外地产生了非常显着的性能提升。
再一:sinonquire(sinon接管require)github.com/rstuven/sinonquire#readme
这些都是相互排斥的,还是你可以混合搭配?例如,rewire 允许访问私有模块,但 proxyquire 似乎不允许,那么您可以将它们组合起来吗?