在模拟Node依赖项时,我发现了以下库:
它们似乎都或多或少地做同样的事情:允许你模拟require()
调用(除了Sinon几乎嘲笑所有东西)。它们似乎都需要一些非常复杂的设置,注意传递给require
的字符串的确切语法 - 在重构期间不是很好。
每个图书馆的优点和缺点是什么?我何时会选择一个而不是另一个?每个库都擅长的示例用例是什么?这个领域的其他产品哪个更好?
答案 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.相反,它是一个更传统的模拟框架。用伪造替换指定的方法,或者创建一个跟踪它被调用的模拟。