2014-01-10 5 views
2

У нас есть служба аналитики, которая зависит от большинства наших контроллеров, чтобы помочь нам отслеживать действия пользователей.AngularJS, как извлечения ложной зависимости, например ngMock

Вместо того, чтобы создавать макетную версию этой службы каждый раз, когда создается тестовый набор, рекомендуется использовать подход ngMock и абстрагировать насмешку. Какой лучший подход?

ответ

3

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"); 
    }); 
}); 
+0

да красиво, это очень близко к тому, что делает ngMock. Я бы предпочел не включать 'mockAnalytics' явно, так как, скорее всего,« ядро ​​»будет зависеть от« аналитики ». Вместо этого у меня должен быть модуль 'myAppMocks', который автоматически включается в тестовый режим и предоставляет эти значения в качестве переопределений. – eddiec

+0

Ах. Ну, я пробовал это, и это, казалось, сработало. Проверьте мои изменения. Это то, что вы хотите? –