Proxyquire,rewire,SandboxedModule和Sinon:利弊

rob*_*ich 62 mocking node.js sinon proxyquire

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

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

每个图书馆的利弊是什么?我何时会选择一个而不是另一个?每个库都擅长的示例用例是什么?这个领域的其他产品还有哪些更好?

rob*_*ich 121

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

  • Proxyquire接管require并允许您在依赖链中的任何位置注入假货.对于requires你没有接管,对于你没有定义的方法,你require接管了它,它将回归到原来的.这可以禁用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.相反,它是一个更传统的模拟框架.用伪造替换指定的方法,或创建一个跟踪它被调用的模拟.

  • 完全没有作弊 - 自我答案很棒! (27认同)
  • 还有一个:sinonquire(sinon接管需要)https://github.com/rstuven/sinonquire#readme (3认同)