Proxyquire,rewire,SandboxedModule,and Sinon: 优缺点

在模仿 Node 依赖关系时,我偶然发现了以下库:

它们似乎都在做或多或少相同的事情: 允许您模仿 require()调用(除了模仿几乎所有事情的 Sinon)。它们似乎都需要一些相当复杂的设置,注意传递给 require的字符串的确切语法——在重构期间不太好。

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

12821 次浏览

这完全像是作弊,但既然没有人回答这个问题,那就这样吧:

  • Proxyquire 接管 require并允许您在依赖链中的任何位置注入赝品。对于你没有接管的 requires 和你没有为 requires 定义的方法,你接管了,它将回到原来的。这可以用 noCallThru禁用。因此它仍然加载原始的,只是用您定义的东西替换东西。与 Rewire 和 SandboxedModule 不同,您不能为 require重载定义全局变量。

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

  • SandboxedModule 与 Proxyquire 几乎完全相同,只是它在一个新的 V8 vm 中运行整个流程。(这种方法存在每次测试的性能成本。)它在 v1.0中还有一个令人讨厌的 bug,当您没有替换引用它不支持的本机模块时,它就会失败。参见 https://github.com/robrich/sandboxed-module-graceful-fs

  • Sinon 不像其他三个人那样接管 require。相反,它是一个更传统的嘲讽框架。用 fakes 替换指定的方法,或者创建一个模拟来跟踪调用它的时间。