在模拟Node依赖项时,我遇到了以下库:
它们似乎都或多或少地在做同一件事:允许您模拟require()
调用(Sinon除外,它模拟了几乎所有内容)。它们似乎都需要一些相当复杂的设置,注意传递给字符串的确切语法require
-在重构过程中效果不佳。
每个图书馆的优缺点是什么?我什么时候可以选择一个?每个库都擅长的示例用例是什么?在这个领域中还有哪些其他更好的产品?
Answers:
完全感觉像是在作弊,但是由于没有其他人在回答这个问题,所以这里是:
Proxyquire接管require
并允许您在依赖关系链中的任何位置注入伪造品。对于require
s,您不接手,对于未定义的方法,您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.那样接管。相反,它是一个更为传统的模拟框架。用伪造品替换指定的方法,或创建一个跟踪调用时间的模拟程序。