2

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?
*/

テスト目的でモジュールに関数を挿入/置換するより良い方法はありますか?

4

2 に答える 2

1

これは「モッキング」または「スタブ」と呼ばれます。これはテスト中の一般的な必要性であり、さまざまなライブラリがあります。おそらく最も人気があるのはシノンでしょう

var stub = sinon.stub(request, [methodName]).returns(false)Sinon を使用すると、 (またはその他の戻り値) のようなことができます。stub.expects(42)関数が呼び出されたときにそれをパラメーターとして受け取ることをアサートするなどのこともできます。

于 2015-08-01T16:21:10.117 に答える