2012-03-01 7 views
3

私はNode.jsを学んでいるところですが、ユニットテストの際にモジュールの依存関係をどのようにモックするのか疑問に思っています。ノードの依存関係を模倣する

例: MongoDBコールを抽象化するモジュールがあります。このモジュールを使用するモジュールは、このようなものから始めることができます。

var myMongo = require("MyMongoModule"); 
// insert rest of the module here. 

私はこのようなモジュールを孤立してテストし、テストではレコードやドキュメントをMongoに挿入しないようにしたいと思います。

プロキシーを使用できるモジュール/パッケージがありますか?require()私は自分のモックで注入できますか?他の人はどのようにこの問題に対処していますか?

答えて

1

あなたが正直に言うとnCore

のような依存性注入のライブラリを使用することができ、これの難しい部分は、実際には、複雑かつ非自明である、のMongoDB APIをからかっています。私は私が使用しているmongo APIの大部分を模擬するのに約1週間かかりますので、マシン上のmongodbデータベースを常時テストするだけです(常に奇妙な状態です)。

次にnCore固有の構文

// myModule.js 
module.exports = { 
    myMethod: function() { 
    this.mongo.doStuff(...) 
    }, 
    expose: ["myMethod"] 
}; 

// test-myModule.js 
var module = require("myModule") 

module.mongo = mongoMock 
assert(module.myMethod() === ...) 
+0

私はMongoのAPIを嘲笑するのは広すぎることに同意します。私はそのプロキシモジュールを模擬しようとしているデータストアの周りにプロキシまたはファサードを適用する傾向があるため、例として使用しています。間違いなくnCoreを調べます。私も面白そうに見える[Horaa] [1]を見つけました。 [1]:https://github.com/arunoda/horaa – JamesEggers

+0

@JamesEggers horaaは地獄のように醜いです。それは 'var os = require(" os ")です。 os.overWriteShit = function(){...} ' – Raynos

+0

nCoreとHoraaを見て、Horaが間違いなく醜いことに同意します。私が探しているものに理想的なSandboxed-Moduleを見つけました。私はそれにもあなたの考えを知って好奇心です。 – JamesEggers

0

Ryanosの提案だけでなく、NPMにHoraaパッケージを確認した後、私はSandboxed-Module.

サンドボックス・モジュールの方に私を指摘しているGoogle Groupにこのスレッドを発見しましたが、私は注入することができます/オーバーライド(必要)私を持つことなく、そのような依存関係を私の単体テストに公開する。

私はまだ他の提案があります。しかし、Sandboxed-Moduleは現時点で私のニーズに合っているようです。 https://npmjs.org/package/a

例えば:

+1

私は個人的に、ファイルベースでファイルに基づいて「醜いハック」を必要とする上書きの方法論を見つけ、適切なDIを得ることを好む。しかし、DIサポート用のコードを書き直すことなく、既存のコードベースで1つまたは2つのモジュールをモックするのに最適です。 – Raynos

+0

@Raynosノードのモジュールシステム(一般的に私が見てきたものと同じように)は、コンストラクタインジェクションの考え方に実際には対応していません。モジュールは、クラスがインスタンス化して注入するためのシンプルな名前空間である可能性がありますが、そのパターンはまだノードコードのサンプルでは見かけませんでした。依存関係のプロパティインジェクションは意図しない方法でパッチを当てるためのモジュールを多く開き、アップグレードした1年前と同じような問題に発展する可能性があります。 – JamesEggers

+0

nCoreに関する一般的なデザインのフィードバックは高く評価されますが、最適な解決策がこれには何か分かりませんが、 'require'を傍受することはできません – Raynos

0

あなたは簡単に "A" を使用して必要モック単体テストでのrequire( './foo')が必要です。
var fakeFoo = {};
var expectRequire = require( 'a')。expectRequire;
expectRequire( './ foo).return(fakeFoo); SUTで

//:=(」./ FOO)が必要
のvar fooという。 // fakeFooを返します

0

あなたのモックを注入するにはrequireを上書きすることが考えられます。しかし、私はレイノスの意見に同意する:

私は個人的にファイル単位でファイル 『醜いハック』に必要かつ適切なDIのために行くことを好む上書きする方法を見つけます。しかし、DIサポート用のコードを書き直すことなく、既存のコードベースで1つまたは2つのモジュールをモックするのに最適です。

適切な依存性注入を使用すると、「醜いハック」を保存するだけでなく、モック注入以外の追加のユースケースを適用することもできます。プロダクションでは、通常はhttp経由で接続をインスタンス化しますが、特定の状況ではVPN経由で接続を確立するために別の実装を注入します。

依存性注入コンテナを探す場合は、excellent articleと私が実装したFire Up!を読んでください。

関連する問題