2013-10-24 10 views
21

私はJasmineテストフレームワークでAngularJSのv1.2.0-rc.3を使用しています。約束を返すサービスメソッドを呼び出すAngularJSコントローラをJasmineでテストする方法

コントローラがサービスメソッドを呼び出すと主張しようとしています。サービスメソッドは約束を返します。コントローラは次のようになります。

angular.module('test', []) 
.controller('ctrl', ['$scope', 'svc', function ($scope, svc) { 
    $scope.data = []; 
    svc.query() 
    .then(function (data) { 
    $scope.data = data; 
    }); 
}]); 

私はそのデータをテストしたいサービスメソッドの延期が解決されたときのスコープに割り当てられています。私は、サービスのモックを作成し、ユニットテストは、次のようになります。

describe('ctrl', function() { 
    var ctrl, scope, svc, def, data = [{name: 'test'}]; 
    beforeEach(module('test')); 
    beforeEach(inject(function($controller, $rootScope, $q) { 
    svc = { 
     query: function() { 
     def = $q.defer(); 
     return def.promise; 
     } 
    }; 
    scope = $rootScope.$new(); 
    controller = $controller('ctrl', { 
     $scope: scope, 
     svc: svc 
    }); 
    })); 
    it('should assign data to scope', function() { 
    spyOn(svc, 'query').andCallThrough(); 
    deferred.resolve(data); 
    scope.$digest(); 
    expect(svc.query).toHaveBeenCalled(); 
    expect(scope.data).toBe(data); 
    }); 
}); 

私は、SVCのクエリメソッドが呼び出されることを期待するが、どうやらそれはしていません。

私はユニットテストで約束した約束を守るためにthisに従った。

私は間違っていますか?

答えて

28

私はスパイを間違った場所に置いていたようです。 BeforeEachに配置すると、テストに合格します。

beforeEach(inject(function($controller, $rootScope, $q) { 
    svc = { 
     query: function() { 
     def = $q.defer(); 
     return def.promise; 
     } 
    }; 
    spyOn(svc, 'query').andCallThrough(); 
    scope = $rootScope.$new(); 
    controller = $controller('ctrl', { 
     $scope: scope, 
     svc: svc 
    }); 
    })); 
+2

spyOn()の最後に 'andCallThrough'コールが特に表示されます。 –

+0

コントローラはインスタンス化時にサービスメソッドを呼び出します。したがって、$コントローラコールの前にそのサービスメソッドを偵察する必要があります。 – Richard

+0

あなたは完全な実際の例を表示できますか?私はこのことがうまくいかない! :/ 私は上記とは異なることをたくさん試しましたが、すべてが未定義です – SinSync

関連する問題