【问题标题】:Proxyquire, rewire, SandboxedModule, and Sinon: pros & consProxyquire、rewire、SandboxedModule 和 Sinon:优点和缺点
【发布时间】:2014-08-03 02:40:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js mocking sinon proxyquire


    【解决方案1】:

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

    • Proxyquire 接管 require 并允许您在依赖链的任何位置注入假货。对于requires,您不会接管,对于您未为requires 定义的方法,您会接管,它会回退到原来的。这可以通过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。相反,它是一个更传统的模拟框架。用伪造品替换指定的方法,或创建一个模拟,以跟踪它何时被调用。

    【讨论】:

    • 完全不作弊 - 自我回答很棒!
    • 您知道“每次测试的性能成本”有多重要吗?或者有人做过性能测试吗?我们用的是 SandboxedModule,看起来很慢。我以前用过proxyquire,很喜欢。想知道是否值得开发人员进行转换。
    • 我没有在它们之间运行性能测试,但我将代码库从 Sandboxed 转换为 Proxyquire(以绕过 v1.0 错误)并且意外地获得了非常显着的性能提升。
    • 还有一个:sinonquire(sinon接管要求)github.com/rstuven/sinonquire#readme
    • 这些都是相互排斥的还是你可以混合搭配?例如,rewire 允许访问私有模块,但 proxyquire 似乎不允许,那么您可以将它们组合起来吗?
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2010-09-20
    • 2017-08-02
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多