Ответ 1
Есть два способа (или более точно).
Воображающий этот вид обслуживания (неважно, является ли это factory):
app.service('foo', function() {
this.fn = function() {
return "Foo";
};
});
С помощью этого контроллера:
app.controller('MainCtrl', function($scope, foo) {
$scope.bar = foo.fn();
});
Один из способов - просто создать объект с помощью методов, которые вы будете использовать, и шпионить за ними:
foo = {
fn: function() {}
};
spyOn(foo, 'fn').andReturn("Foo");
Затем вы передаете этот foo
в качестве депо на контроллер. Не нужно вводить услугу. Это будет работать.
Другим способом является издевка над сервисом и впрыснуть посмеянный:
beforeEach(module('app', function($provide) {
var foo = {
fn: function() {}
};
spyOn(foo, 'fn').andReturn('Foo');
$provide.value('foo', foo);
}));
Когда вы вводите foo
, он вводит это.
Смотрите здесь: http://plnkr.co/edit/WvUIrtqMDvy1nMtCYAfo?p=preview
Жасмин 2.0:
Для тех, кто борется с выполнением ответа,
по Жасмину 2.0 andReturn()
стал and.returnValue()
Так, например, в первом тесте из плункера выше:
describe('controller: MainCtrl', function() {
var ctrl, foo, $scope;
beforeEach(module('app'));
beforeEach(inject(function($rootScope, $controller) {
foo = {
fn: function() {}
};
spyOn(foo, 'fn').and.returnValue("Foo"); // <----------- HERE
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {$scope: $scope , foo: foo });
}));
it('Should call foo fn', function() {
expect($scope.bar).toBe('Foo');
});
});
(Источник: Rvandersteen)