0

localForage.getItem メソッドをモックする最良の方法は何ですか? localForage.getItem が呼び出されたときにサンプル オブジェクトを返すだけです。

4

1 に答える 1

2

最初に、サード パーティのライブラリを注入可能なサービスにラップして、テストでモック実装と交換できるようにします。

app.factory('localForage',function(){
  //likely coming from global namesapce 
  return localForage;
});

これは、ディレクティブ、サービス、コントローラーなどに注入できます

//example with controller

myApp.controller('myCtrl',['localForage',function(localForage){
   this.getItem = localForage.getItem;
   this.setItem = loaclForage.setItem;
}]);

ここでのアイデアは、テストで通常の実装をモックに置き換えることです。それにはいくつかの方法があります。

  • グローバル: テストを実行する前に、すべてのテストのモック実装を定義するモック モジュールを作成します。実際の localForage モジュールの代わりに (beforeEach(module('myMockModule'))) を呼び出します。

  • テスト スイート ベース: テストを実行する前に別の実装を "$provide" します。

beforeEach(module('myModule',function($provide){
  $provide.factory('localForage', function(){
    return MockImpl;
  });
});

  • 場合によっては、モック実装を直接注入できます。

var ctrl;

beforeEach(inject(function($controller){
   ctrl = $controller('myCtrl',{localForage:mockImpl});
}))

モックの実装については、それを使って何をしたいか (スパイ、スタブ、その他のもの) によって異なりますが、実際のサービスと同じ API を実装することを目的としています。

var mockImpl = {
   getItem : angular.noop,
   setItem : angular.noop
}

この単純なものは、たとえば、localForage が呼び出されたかどうか、およびどの引数で呼び出されたかを確認したい場合に問題ありません (spyOn(mockImpl, 'getItem') を使用します)。

于 2015-11-23T03:38:16.583 に答える