3

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.valuenullの場合)。

ここに質問があります:スコープモデルとして設定されたプロミスをテストする正しい方法は何ですか?このresult.captureは私がやっていることが大丈夫ですか、それともそれについてもっと良い方法がありますか?また、応答のフラッシュでプロミスの添付ファイルを逆にすると、応答が解決およびキャプチャされない理由を本当に知りたいです...?

4

1 に答える 1

2

良い質問。私の最初の反応は、コントローラーユニットテストが実際にここで ngResource をテストしているようだということです。コントローラーのテストでは、リソースをモックアウトします。

mockResource = {query: jasmine.createSpy('query').andReturn([{id: 1, name: foo}])

module(function ($provide) {
   $provide.value('Resource', mockResource);

...

expect(mockResource.find).toHaveBeenCalled()
expect(scope.items)....

これにより、コントローラーを分離してテストできます。

于 2013-02-27T15:49:19.620 に答える