2017-01-06 16 views
0

角度アプリケーションをテストするためにJasmineを使用していますが、コントローラのready()関数が呼び出されたときにコントローラ内のgetItem()関数が呼び出されることをテストしたいと思います。角度単位テスト、SpyOnスタンドアロン関数

--- ---コントローラ

var vm = this; 
vm.items = []; 
$ionicPlatform.ready(ready); 

function ready() { 
    vm.items.push(getItem()); 

    function getItem(){ 
      var item = //do stuff to get item; 
      console.log('getItem called'); 
      return item; 
    } 
} 

---あなたはJavascriptのユニットテストの基本的な限界時に来ている仕様---残念ながら

describe('Controller', function(){ 

    //--- Load app with dependencies and module to test code omitted. 

    beforeEach(function(){ 
      //How do I spy on getItem() to test that it was called? 
      //I've tried getItem = jasmine.createSpy() 
      //I've tried spyOn(window, 'getItem') 
    } 

    //--- Initialize the controller and a mock scope code omitted. 

    beforeEach(function(done){ 
      $ionicPlatform.ready(function(){ 
       done(); 
      }); 
    }); 

    it('getItem function should get called', function(){ 
      expect(getItem).toHaveBeenCalled(); 

      //--- Note, getItem does not get called according to the expect statement, 
      //--- but does output 'getItem called' to the terminal when running the test. 
    }); 

}); 

答えて

0

、ジャスミンでは、あなたはいくつかのオブジェクトに公開されているメソッドのみができます。他の関数の内部にあり、とにかく公開されていない関数がある場合、直接テストすることはできません。

  1. それは(一般的に、あなたがテストしているどんな角度成分の方法など)にスパイすることができますような方法で機能を公開:

    はしかし、あなたはあなたに利用可能な2つの選択肢を持っています。

  2. 間接的にテストします。

最初はおそらく比較的自明ですが、後者は多少混乱するかもしれません。基本的には、関数が呼び出された場合はを直接にテストできませんが、この関数は呼び出したダウンストリームメソッドを持っている可能性があります。たとえば、readyが呼び出された後にvm.items.pushが大きいことをテストするか、またはspyOn(console.log)expect(console.log).toHaveBeenCalledWith('getItem called')とすることができます。

私はテスト容易化の目的のためにのみリファクタリングをやって好きではないので、あなたが、私はアプローチ2を好む傾向にあるinternet--上の両方のアプローチの引数を見つけることができますが、多くは、テスト容易化のためにリファクタリングすることは一般的に良く生み出すと主張するだろうコード。その選択はあなたのものです。お役に立てれば!

関連する問題