私はこれ(angularjs、jasmine、testacular)に非常に慣れておらず、このコードを持っています(少し単純化して、重要なものだけを残しています):
//my_module.js
angular.module('my_module', ['my_data'])
.config([...]);
.controller('my_controller', ['$scope', 'my_data',
function($scope, my_data) {
$scope.my_function = function() {
return my_data.my_factory.save().then(function () {
console.log('saved');
},
function() {
console.log('Error');
});
}
}
)
//my_data.js
angular.module('my_data', [])
.factory('my_factory', ['$q', '$rootScope',
function($q, $rootScope) {
var my_factory= function(my_data) {
angular.extend(this, my_data);
}
my_factory.prototype.save = function() {
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve();
$rootScope.$apply();
}, 1000);
return deferred.promise;
}
return my_factory;
}
])
したがって、私がやりたいのは、my_module.my_controller.my_functionが起動されたときにmy_data.my_factory.saveが呼び出されるかどうかをテストすることです。
//my_test.js
describe('testing my_controller.my_function', function () {
beforeEach(module('my_module'));
var $rootScope, $controller;
beforeEach(inject(function(_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
$controller = _$controller_;
}));
scope = $rootScope.$new();
it('should call the save function', function() {
scope.my_function();
expect(my_data.save).toHaveBeenCalled();
});
}
少し助けが必要です。
あなたはあなたが必要とするものからそれほど遠くありません。まず、my_data
をmy_module
依存関係として必要とするため、my_module
をコントローラーに挿入する必要はなく、ファクトリ(my_factory
)だけを挿入する必要があります。
次に、 ngMock を利用します。ドキュメントは完全ではありませんが、優れた洞察を提供します。詳細 ここ および ここの例 (test/unit/controllers
を探してください)。
基本的に、あなたがしたいのは、サービスが呼び出されたことを保証できるように、サービスをモックすることです。これを実現するには、$provide
呼び出しにangular.mock.module
を挿入し、モックされたmy_factory
サービスを提供します。それを達成するための最良の方法は次のようなものです:
describe('testing my_controller.my_function', function () {
var mockedFactory, $rootScope, $controller;
beforeEach(module('my_module', function($provide) {
mockedFactory = {
save: jasmine.createSpy()
};
$provide.value('my_factory', mockedFactory);
}));
beforeEach(inject(function(_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
$controller = _$controller_;
}));
scope = $rootScope.$new();
it('should call the save function', function() {
scope.my_function();
expect(mockedFactory.save).toHaveBeenCalled();
});
}
このようにして、my_factory
依存関係をオーバーライドします。