APIのラッパーであるnodejsで小さなプロジェクトを作成しています。nodeunitを使用していくつかの単体テストを作成しており、さまざまなモック関数をモジュールに挿入する必要があります (たとえば、サーバーへの HTTP 要求の作成をシミュレートし、さまざまな応答を出力してコードをテストする関数)。
私が持っている質問は、これらの関数をモジュールにどのように挿入するのですか?
理論的には次のように機能するはずの 2 つの方法を特定しました。
方法 1
置き換えたいモジュールのフォルダーの名前を変更し、挿入したいコードを含む新しいフォルダーを追加します。
./node_modules/request -> ./node_modules/request.tmp
./tests/myRandomFunction -> ./node_modules/request
テストを実行した後、私は反対のことをします:
./node_modules/request -> ./tests/myRandomFunction
./node_modules/request.tmp -> ./node_modules/request
これはかなりハックに思え、理論的には機能するはずですが、私が試みたいものではありません。
方法 2
これは、モジュールの初期化を利用する私の推奨方法です。私のモジュールは、次のようにさまざまなオプションを含めることができる JSON オブジェクトを受け取ります。
var module = require('./module')({
option1: '',
option2: '',
...
});
たとえば、さまざまな関数を含む JSON オブジェクトの値を使用して、「_testing」と呼ばれるこの JSON オブジェクトにキーを追加することを計画しています。
var module = require('./module')({
_testing: {
request: function() {return false;}
}
});
私のモジュールでは、次のことができます。
- this._testing が存在し、JSON オブジェクトである場合
- this._testing をループします
- this._testing の各キーについて
- キーと同じ名前の関数をその値に置き換えます。
eval(''+key+' = this._testing.'+key) //eval('request = this._testing.request')
/*
eval can be dangerous I should probably perform some validation for example is key a function we want to be replaced? Can I check if nodeunit is testing my module and if it isn't don't do anything?
*/
テスト目的でモジュールに関数を挿入/置換するより良い方法はありますか?