我们有一个分析服务,它依赖注入我们的大多数控制器,以帮助我们跟踪用户的行为。
不是每次创建测试套件时都要设置此服务的模拟版本,而是首选采用ngMock方法并抽象模拟。什么是最好的方法?
答案 0 :(得分:3)
修改强>
看起来您可以通过加载替换它的模块来覆盖服务。
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");
});
});