2016-09-07 5 views
0

API呼び出しに別のサービスを使用するサービスをテストしています。これをデータサービスと呼んでいます。データサービスは他の場所でテストされているので、空の関数を含む単純な実装でデータサービスを抽象化しました。遅延オブジェクトとJasmineのspyOn構文を使用してデータを返します。

私がこのアプローチで見つけた問題は、データが返されたときに、$ httpBackendを使用した場合と同じように、呼び出し元のオブジェクトですぐに利用できないということです。私はちょうど$ httpBackendを使用することができますが、私はこのアプローチで何か(単純かどうか)を逃したかどうかを知りたいと思います。私がテストをしようとしているコードの

例セクション:サイドノートとして

storeTheData = dataService.getSomeData(); 
storeTheData.$promise.then(function(data) { 

    /*this would work*/ 
    console.log(data); 

    /*but this would not, when testing using $q*/ 
    _.forEach(storeTheData, function(storedData) { 
     /*do something with each object returned*/ 
    }); 
}); 

、私は状況が別の回線で... $ promise.thenによって助けられるとは思いませんが、上記の試験、コンソールで

beforeEach(
    ... 
    dataService = { 
     getSomeData: function() { } 
    }; 
    getSomeDataDeferred = $q.defer(); 
    spyOn(dataService, "getSomeData").and.returnValue({$promise: getSomeDataDeferred.promise}); 
    ... 
); 

it(... 
    getSomeDataDeferred.resolve([{obj: "obj1"}, {obj: "obj2"}]); 
    $scope.$apply(); 
    ... 
); 

:理想的に私は(私はしばらく前に書かれたものにテストカバレッジを提供しています...)テストの

例を、コードを変更しないでしょう。ログ(データ)は.then()に渡すことでデータにアクセスできるので、テスト可能である必要があります。しかし、データはstoreTheDataからすぐには入手できないため、storeTheData [0] .objは未定義です。 $$ state.value

私が言ったように、私は$ httpBackendを代わりに使うことができると知っていますが、そこには何らかの方法があります。テストするコードをに変更せずに$ q でこれを行いますか?

答えて

0

$ q.resolveでこれを行う方法が見つかりませんでしたが、データサービスの使用やテスト中のコードの変更に関係しないソリューションがあります。私が避けたい主な理由は、データサービスを副作用としてテストし、コードを変更することでした。

私のソリューションは、データサービスの私の基本的な実装でそれを返し、その後...

$resource = $inject.get("$resource"); 

... $インジェクターを経由して$リソースオブジェクトを作成することでした。これは、$ httpBackendを使用して、データサービスの定義に一貫性を持たせることに依存しないエンドポイントへの要求に応答できることを意味します。

dataService = { 
    getSomeData: function() { 
     /* new code starts here */ 
     var resource = $resource(null, null, { 
      get: { 
       method: "GET", 
       isArray: true, 
       url: "/getSomeData" 
      } 
     }); 

     return resource.get(); 
     /* new code ends here */ 
    } 
}; 
... 
$httpBackend.when("GET", "/getSomeData").respond(...; 
関連する問題