2

我们有一个分析服务,它依赖注入到我们的大多数控制器中,以帮助我们跟踪用户所做的操作。

与其在每次创建测试套件时都设置此服务的模拟版本,不如采用 ngMock 方法并抽象模拟。最好的方法是什么?

4

1 回答 1

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");
  });
});
于 2014-01-10T12:45:41.457 回答