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に従った。
私は間違っていますか?
spyOn()の最後に 'andCallThrough'コールが特に表示されます。 –
コントローラはインスタンス化時にサービスメソッドを呼び出します。したがって、$コントローラコールの前にそのサービスメソッドを偵察する必要があります。 – Richard
あなたは完全な実際の例を表示できますか?私はこのことがうまくいかない! :/ 私は上記とは異なることをたくさん試しましたが、すべてが未定義です – SinSync