Proxyquire,rewire,SandboxedModule和Sinon:pros&缺点

时间:2014-06-12 17:02:58

标签: node.js mocking sinon proxyquire

在模拟Node依赖项时,我发现了以下库:

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

每个图书馆的优点和缺点是什么?我何时会选择一个而不是另一个?每个库都擅长的示例用例是什么?这个领域的其他产品哪个更好?

1 个答案:

答案 0 :(得分:117)

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

  • Proxyquire接管require并允许您在依赖关系链中的任何位置注入假冒。对于require你不能接管,对于你没有为你接管的require定义的方法,它会回归到原来的。{1}}。可以使用noCallThru禁用此功能。因此它仍然加载原始,只是用你定义的东西替换东西。与Rewire和SandboxedModule不同,您无法为require重载定义全局变量。

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

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

  • Sinon并没有像其他人一样接管require 3.相反,它是一个更传统的模拟框架。用伪造替换指定的方法,或者创建一个跟踪它被调用的模拟。