EDIT
Похоже, вы можете просто отменить службу, загрузив модуль, который заменяет его.
http://plnkr.co/edit/mHI19j6FDtV8UElRWvUs?p=preview
http://plnkr.co/edit/lZg8eQdoQRNtqedcr2UU?p=preview
Одна вещь, которую вы могли бы сделать, если я правильно понял ваш вопрос правильно, это не ваши модули контроллера зависит от того отслеживания службы, и поставить эту зависимость в на уровне приложения. Затем в ваших тестах просто загрузите модуль, содержащий измененную версию, явно.
Так как:
var core = angular.module('core', []);
var analytics = angular.module('analytics', []);
var app = angular.module('plunker', ['analytics', 'core']);
var mockAnalytics = angular.module('mockAnalytics', []);
core.controller('MainCtrl', function($scope, tracker) {
$scope.track = tracker.track();
});
analytics.factory('tracker', function() {
var service = {};
service.track = function() {
return "I'm real";
}
return service;
});
mockAnalytics.factory('tracker', function() {
var service = {};
service.track = function() {
return "I'm a mock";
}
return service;
});
Тесты:
describe('Testing a controller', function() {
var $scope = null;
var ctrl = null;
beforeEach(module('core'));
beforeEach(module('mockAnalytics'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
}));
it('should have its $scope.track == "I\'m a mock"', function() {
expect($scope.track).toEqual("I'm a mock");
});
});
да красиво, это очень близко к тому, что делает ngMock. Я бы предпочел не включать 'mockAnalytics' явно, так как, скорее всего,« ядро »будет зависеть от« аналитики ». Вместо этого у меня должен быть модуль 'myAppMocks', который автоматически включается в тестовый режим и предоставляет эти значения в качестве переопределений. – eddiec
Ах. Ну, я пробовал это, и это, казалось, сработало. Проверьте мои изменения. Это то, что вы хотите? –