2016-10-05 21 views
3

は、私はいくつかの機能が含まれているユーティリティモジュールを持っているし、ファイルの最後に、私はそうのようにそれらをエクスポートします。スパイモジュール・エクスポート・ユーティリティ機能のJavaScript(ES6)で

module.exports = { 
    someFunction1, 
    someFunction2, 
    someFunction3, 
} 

次に、それらの関数の単体テストを記述したいと思います。関数のいくつかはお互いに依存します。例えば、someFunction1がsomeFunction2を呼び出すかもしれないというように、彼らは互いに呼び出す。円形の問題はありません。私は、関数のいずれかが呼び出されたことをスパイする必要があるまで

すべてが、うまく動作します。どうしたらいいですか?現在私はChaiとSinonを使用しています。テストファイルで

が、私はモジュールのような全ファイルインポートしている:

const wholeModule = require('path/to/the/js/file') 

そして最後に、私のテストでは、次のようになります。

it('should call the someFunction2', (done) => { 
    const spy = sinon.spy(wholeModule, 'someFunction2') 

    wholeModule.someFunction1() // someFunction2 is called inside someFunction1 

    assert(spy.calledOnce, 'someFunction2 should be called once') 
    done() 
}) 

問題は、テストが失敗したということであり、 someFunction1では、someFunction2関数が直接使用されるためです。私はスパイをモジュールオブジェクトの関数に適用します。しかし、それは別の目的です。ここでsomeFunction1の例です:

function someFunction1() { 
    someFunction2() 
    return 2; 
} 

私はそれが動作しません理由を知っているが、私はそれを動作させるために、この場合のベストプラクティスがどうなるか分からないのですか?助けてください!

答えて

3

rewireモジュールを使用できます。

ソースコード:

function someFunction1() { 
    console.log('someFunction1 called') 
    someFunction2(); 
} 

function someFunction2() { 
    console.log('someFunction2 called') 
} 

module.exports = { 
    someFunction1: someFunction1, 
    someFunction2: someFunction2 
} 

テストケース:ここでは一例である

'use strict'; 

var expect = require('chai').expect; 
var rewire = require('rewire'); 
var sinon = require('sinon'); 

var funcs = rewire('../lib/someFunctions'); 

it('should call the someFunction2',() => { 
    var someFunction2Stub = sinon.stub(); 
    funcs.__set__({ 
    someFunction2: someFunction2Stub, 
    }); 

    someFunction2Stub.returns(null); 

    funcs.someFunction1(); 

    expect(someFunction2Stub.calledOnce).to.equal(true); 
}); 
+0

惜しいが、= /動作しませんでした。それは明らかに偽の関数を呼び出します。しかし、スパイが呼ばれたと主張しているとき、それは呼ばれていません –

+0

@ VilleMiekk-oja編集後に解決策を試しましたか? –

+0

はい、結果に違いはありません –

関連する問題