NodeJS

2017-01-22 4 views
0

**アップデートで、匿名のエクスポートで関数をスタブにするためにrewireを使用してください。下のコメントによれば、ユースケースは明確ではないかもしれません。 展開するには、私のアプリケーションモジュールfoo()はbar()を呼び出します。これは複雑なロジックを実行し、ブール値を返します。私は単体テスト(Mocha)を作成していて、rewireを使ってfoo()メソッドを再配線しようとしているので、バーを実際に呼び出すことなくtrue/falseをbar()に渡すことができます。NodeJS

無名関数内でbar()メソッドをスタブ(別名rewire)しようとしています。出来ますか?私は非常にいくつかの方法を試した後にbar()を上書きする方法を見ることができません。

//foobar.js 
module.exports = function(config) { 

    function bar() { 
     console.log('why am i in _%s_ bar?', config) 
     //some logic 
     return true 
    } 

    function foo() { 
     if (bar()) { 
      console.log('should not get here, but someVar is passing: ', someVar) 
      return true 
     } else { 
      console.log('should get here, though, and we still see someVar: ', someVar) 
      return false 
     } 
    } 

    return { 
     foo: foo, 
     bar: bar 
    } 
} 

//rewire_foobar.js 
var rewire = require('rewire') 
var myModule = rewire(__dirname + '/foobar.js') 

myModule.__with__({ 
    'bar': function(){ 
     console.log('changing return to false from rewire') 
     return false 
    }, 
    'someVar': "abcde" 

})(function() { 

    var result = myModule('a').foo() 
    console.log('result is: ', result) 

}) 

が通過している結果

why am i in _a_ bar? 
should not get here, but someVar is passing: abcde 
result is: true 

someVarが得られます。しかし、私はbar()をrewireして、その内部のロジックが呼び出されないようにする必要があります。

+0

あなたが達成しようとしているかを説明場合は、より良い助けを得ることができます。 "無名関数の中でrewire()bar()メソッド"は意味のある説明ではありません(少なくとも私にとって)。あなたは実際に何を達成しようとしていますか?希望の最終結果は何ですか? – jfriend00

+0

私のアプリケーションでは、bar()はもっと多くのロジックを行い、他の関数を呼び出しますが、最終結果はtrueまたはfalseを返します。私はテストスイートでbar()関数をスタブしようとしているので、さまざまなテストシナリオでtrue/falseを返すことができます。 rewire()は、bar()のロジックを呼び出さずにfoo()の機能をテストするためにMochaで使用されています。理にかなっている? – tagyoureit

答えて

0

回避策が見つかりました。私の最初の目的はfoo()とstub bar()をテストして結果/テストパラメータを制御できるようにすることでした。誰かがより良い解決策を考え出すことができれば幸いです。

このアプローチでは、1つの変数と関数呼び出しをすべてスタブ/再配線する必要があります。それは私のテストでは大丈夫ですが、すべてのソリューションで実現可能ではないかもしれません。

私の回避策は次のとおりです。

  1. は一時ファイルにFOO()関数を記述します。 (テストでは、この をbefore()ブロックで実行する必要があります)。

  2. この機能をスタンドアロン機能としてテストします。

  3. テストテンポラリファイルを削除します。ここで

はfoobar.spec.jsのためのコードです:

var rewire = require('rewire') 
var foobar = require('./foobar.js') 
var fs = require('fs') 

//extracts the function to test and exports it as temp() 
//could be done in a before() block for testing 
var completeHack = 'exports.temp = ' + foobar().foo.toString() 
//write the function to a temporary file 
fs.writeFileSync(__dirname + '/temp.js', completeHack , 'utf8') 

//rewire the extracted function 
var myModule = rewire(__dirname + '/temp.js') 

myModule.__with__({ 
    //and stub/rewire and variables 
    'bar': function(){ 
     console.log('changing return to false from rewire') 
     return false 
    }, 
    'someVar': "abcde", 
    'config': 'not really important' 

})(function() { 
    //and test for our result 
    var result = myModule.temp() 
    console.log('result is: ', result) 

}) 

//and finally delete the temp file. Should be put in afterEach() testing function 
fs.unlinkSync(__dirname + '/temp.js')