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

当嘲笑节点依赖关系时,我发生了以下库:

  • Proxyquire
  • 换铁线
  • SandboxedModule
  • 兴农

他们似乎都做了或多或less都是一样的事情:允许你模拟require()调用(除了Sinon外,它几乎包含了所有的东西)。 他们似乎都需要一些相当复杂的设置,注意传递给require的string的确切语法 – 在重构期间不是很好。

每个图书馆有什么优点和缺点? 我什么时候会select一个呢? 什么是每个图书馆擅长的示例用例? 这个领域的其他产品有哪些更好?

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

  • Proxyquire接pipe需求,让你在依赖链的任何地方注入假货。 因为要求你不要接pipe,而你没有定义的方法要求你接pipe,它会回落到原来的。 这可以通过noCallThru禁用。 因此它仍然加载原来的东西,只是用你定义的东西来代替东西。 与Rewire和SandboxedModule不同,你不能为你需要的重载定义全局variables。

  • 重新接pipe需求并将__get____set__属性注入到每个模块中。 如果您知道私有variables名称,则可以将其replace。 认为dependency injection。

  • SandboxedModule与Proxyquire几乎相同,只是它在新的V8 vm中运行整个进程。 (这种方法每次testing的性能成本都是这样的。)它在1.0版本中也有一个令人讨厌的bug,当你没有replace的东西引用它不支持的本地模块时,它会失败。 请参阅https://github.com/robrich/sandboxed-module-graceful-fs

  • Sinon并不像其他的那样需要3.相反,这是一个更传统的嘲讽框架。 用伪造replace指定的方法,或者创build一个跟踪被调用时间的模拟。