提问者:小点点

Proxyquire、rewire、SandboxedModule和Sinon:优缺点


在模拟节点依赖关系时,我遇到了以下库:

  • 代理
  • 重新布线
  • 沙盒模块
  • 锡农

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

每个图书馆的利弊是什么?我什么时候会选择一个而不是另一个?每个库都擅长的示例用例是什么?这个空间还有哪些产品比较好?


共1个答案

匿名用户

这完全感觉像是作弊,但既然没有人回答这个问题,下面是:

>

  • ProxyQuire接管require并允许您在依赖链中的任何位置注入假象。对于require,如果您没有接管,对于您没有为require定义的方法,如果您接管,它将返回到原始方法。可以使用nocallthru禁用此功能。因此,它仍然加载原始的,只是用你定义的东西替换东西。与Rewire和SandboxedModule不同,您不能为require重载定义全局变量。

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

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

    Sinon不像其他3个那样接管require。相反,这是一个更传统的嘲讽框架。用fake替换指定的方法,或者创建一个mock来跟踪它被调用的时间。