72

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

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

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

4

1 回答 1

143

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

  • Proxyquire 接管require并让您在依赖链中的任何位置注入假货。对于require你没有接管的 s 和你没有为require你接管的 s 定义的方法,它会回退到原来的。这可以用 禁用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 框架。用假货替换指定的方法,或创建一个模拟,以跟踪它何时被调用。

于 2014-06-15T00:46:29.860 回答