AngularJSが行う多くの魔法の1つは、次のようなコードを記述できるようにする自動Promise解決です。
function SomeCtrl($scope, Resource) {
$scope.items = Resource.query();
}
ただし、JSON-RPCとngResourceを介して関数を操作しているサービスは、うまく機能していないようです。適切に応答するためにバックエンドをモックアウトする必要がありましたが、何らかの理由で、コントローラーレベルで応答をテストする方法がわからないようです。
"use strict";
describe('controllers', function() {
describe('LibraryCtrl', function() {
var scope, ctrl;
beforeEach(inject(function($rootScope, $controller) {
JsonRpc.respondWith({ some : data });
scope = $rootScope.$new();
ctrl = $controller(LibraryCtrl, { $scope : scope });
// controller does `$scope.items = RPCService.get()`
}));
it("should create a `items` model with data fetched via JSON-RPC", function() {
// here's where I'm very confused
// JsonRpc does $httpBackend.flush()
JsonRpc.respond();
// now I want to inspect the property on the controller
expect(scope.items).toEqualData( { some : data } );
});
});
});
問題は、scope.items
約束です。どうやら$digest()
promiseを解決せず、戻り値をモデル値として再アタッチしないため、その特定のプロパティはpromiseのままになります。単純な平等の主張はできません。
私の回避策は、promiseキャプチャモックを使用することです。
var result = {
capture : function(v) { result.value = v; },
value : null,
};
そして、これを試してください:
scope.items.then(result.capture);
expect(result.value).toEqualData(...);
これは機能します(しかし、どういうわけか間違っていると感じます)。補足として(ブラウニーポイントの場合、これは実際の質問ではありません)、result.capture
チェーンをと交換するJsonRpc.respond()
と、テストが失敗します(result.value
nullの場合)。
ここに質問があります:スコープモデルとして設定されたプロミスをテストする正しい方法は何ですか?このresult.captureは私がやっていることが大丈夫ですか、それともそれについてもっと良い方法がありますか?また、応答のフラッシュでプロミスの添付ファイルを逆にすると、応答が解決およびキャプチャされない理由を本当に知りたいです...?