2017-11-14 19 views
0

別の関数内の関数が呼び出されたことを単体テストできますか?私はソースコードを変更することができないので、そのままテストする必要があります。別の関数内の関数が呼び出されたことを単体テストできますか?

どうすればいいですか?

function B(){ console.log('function b'); } 

function A(){ 
    B(); 
} 

ジャスミンテスト:

it('should check function B in function A was called', function() { 
    spyOn(window, 'B'); 
    A(); 
    expect(B).toHaveBeenCalled(); 
}); 
+0

私は答えを追加したいが、私はそれがほとんどの意見だと思います。私にとって、これはコードの匂いです。ユニットテストは、個々のユニット(モジュール、関数、クラス)をプログラムの残りの部分とは独立してテストします。基本的に、彼らは入力を与えれば出力を得ることをテストします。入れ子にされた呼び出しを移動し、代わりにテスト用の合成ツールを使用することをお勧めします。パイプのようなものです。 'pipe(a、b)(inputToA)'はモックやスパイのない完全にテストされた3つの関数を与えます。これは多くの人が握っている意見ではないので、塩の穀物でそれを取る。 – ktilcu

答えて

0

スパイ

ジャスミンのスパイと呼ばれるテスト二重の機能を持ってい

ここに私のコードです。スパイは、 関数をスタブし、その呼び出しとすべての引数を追跡できます。スパイは、記述されたブロックまたは定義されたブロックにある のみ存在し、各スペックの後には、 が削除されます。スパイと相互作用する特別なマッチャーがあります。 Jasmine 2.0ではこの構文が変更されました。スパイが呼び出された場合、 toHaveBeenCalledマッチャーはtrueを返します。引数リスト がスパイへの記録された呼び出しのいずれかと一致する場合、 toHaveBeenCalledWith matcherはtrueを返します。

describe("A spy", function() { 
    var foo, bar = null; 

    beforeEach(function() { 
    foo = { 
     setBar: function(value) { 
     bar = value; 
     } 
    }; 

    spyOn(foo, 'setBar'); 

    foo.setBar(123); 
    foo.setBar(456, 'another param'); 
    }); 

    it("tracks that the spy was called", function() { 
    expect(foo.setBar).toHaveBeenCalled(); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(foo.setBar).toHaveBeenCalledWith(123); 
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); 
    }); 

    it("stops all execution on a function", function() { 
    expect(bar).toBeNull(); 
    }); 
}); 
関連する問題