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 でこれを行いますか?