web-dev-qa-db-ja.com

Proxyquire、rewire、SandboxedModule、およびSinon:長所と短所

Node依存関係をモックするとき、私は次のライブラリに遭遇しました:

それらはすべて、ほぼ同じことを行うように見えます:require()呼び出しをモックできるようにします(ほとんどすべてをモックするSinonを除く)。それらはすべて、かなり複雑なセットアップを必要とするようです。requireに渡される文字列の正確な構文に注意してください。リファクタリング中は大きくありません。

各ライブラリの長所と短所は何ですか?どちらを選択するのですか?各ライブラリが優れているユースケースの例は何ですか?この分野で他に優れている製品は何ですか?

60
robrich

それは完全に不正行為のように感じますが、誰も質問に答えていないので、ここに行きます:

  • Proxyquireはrequireを継承し、依存関係チェーンのどこにでも偽物を注入できます。 requiresを引き継ぐことはせず、requiresを定義しないメソッドを引き継ぐことは、元に戻ります。これはnoCallThruで無効にできます。したがって、それはまだ元のものをロードし、あなたが定義したもので物事を置き換えるだけです。 RewireやSandboxedModuleとは異なり、requireオーバーロードのグローバル変数を定義することはできません。

  • Rewireはrequireを引き継ぎ、__get__および__set__プロパティを各モジュールに。プライベート変数名がわかっている場合は、置き換えることができます。依存性注入を考えてください。

  • SandboxedModuleは、新しいV8 vmでプロセス全体を実行することを除いて、Proxyquireとほぼ同じです。 (このアプローチにはテストごとのパフォーマンスコストがあります。)また、v 1.0には、サポートしていないネイティブモジュールを参照しているものを参照しないと失敗するという厄介なバグがあります。 https://github.com/robrich/sandboxed-module-graceful-fs を参照してください。

  • Sinonは他の3.のようにrequireを引き継ぎません。むしろ、より伝統的なモックフレームワークです。指定されたメソッドを偽物に置き換えるか、呼び出されたときに追跡するモックを作成します。

120
robrich