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


71

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

它们似乎都或多或少地在做同一件事:允许您模拟require()调用(Sinon除外,它模拟了几乎所有内容)。它们似乎都需要一些相当复杂的设置,注意传递给字符串的确切语法require-在重构过程中效果不佳。

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

Answers:


134

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

  • Proxyquire接管require并允许您在依赖关系链中的任何位置注入伪造品。对于requires,您不接手,对于未定义的方法,您require可以接管。可以使用禁用此功能noCallThru。因此,它仍然可以加载原始内容,只是用您定义的内容替换内容。与Rewire和SandboxedModule不同,您不能为require重载定义全局变量。

  • 重新接线接管require并注入__get____set__属性到每个模块。如果知道私有变量名称,则可以替换它。考虑依赖注入。

  • SandboxedModule与Proxyquire几乎相同,只是它在新的V8虚拟机中运行整个过程。(此方法会降低每次测试的性能成本。)在v 1.0中还存在一个令人讨厌的错误,当您不替换的内容引用了它不支持的本机模块时,该错误将导致失败。见https://github.com/robrich/sandboxed-module-graceful-fs

  • Sinon不会require像其他3.那样接管。相反,它是一个更为传统的模拟框架。用伪造品替换指定的方法,或创建一个跟踪调用时间的模拟程序。


33
完全不作弊-自我解答很棒!
克里斯·范德维尔德

您是否有其他想法,“每次测试的性能成本”有多重要?还是有人进行过性能测试?我们使用SandboxedModule,它看起来非常慢。我以前使用过proxyquire并喜欢它。想知道是否值得开发人员切换。
tandrewnichols 2015年

1
我没有在它们之间进行性能测试,但是我将代码库从沙盒转换为Proxyquire(以解决v1.0错误),并且意外地获得了非常可观的性能提升。
罗布里希2015年

3
还有一个:sinonquire(sinon接管需求)github.com/rstuven/sinonquire#readme
Ricardo Stuven 2015年

这些都是相互排斥的,还是可以混合搭配的?例如,rewire允许访问私有模块,但proxyquire似乎不允许,因此您可以将它们组合吗?
GreensterRox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.