在模拟 Node 依赖项时,我遇到了以下库:
他们似乎都在做或多或少相同的事情:允许你模拟require()
调用(除了模拟几乎所有东西的Sinon)。它们似乎都需要一些非常精细的设置,注意传递给的字符串的确切语法require
——在重构期间不是很好。
每个图书馆的优缺点是什么?我什么时候会选择其中之一?每个库都擅长的示例用例是什么?这个领域还有哪些更好的产品?
这完全感觉像是在作弊,但由于没有其他人回答这个问题,所以这里是:
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 框架。用假货替换指定的方法,或创建一个模拟,以跟踪它何时被调用。