AngularJS在服务测试中注入服务模拟

时间:2013-04-15 18:32:31

标签: unit-testing angularjs jasmine angularjs-service

我一直试图测试服务一段时间没有用,希望得到一些帮助。这是我的情况:

我的服务看起来有点像这样

myModule.factory('myService', ['$rootScope', '$routeParams', '$location', function($rootScope, $routeParams, $location) {

  var mySvc = {
    params: {}
  }

  // Listen to route changes.
  $rootScope.$on('$routeUpdate', mySvc.updateHandler);

  // Update @params when route changes
  mySvc.updateHandler = function(){ ... };

  ...
  ...

  return mySvc;

}]);

我想在将服务注入我的测试之前模拟注入'myService'的服务,以便我可以测试下面的初始化代码

  var mySvc = {
    params: {}
  }

  // Listen to route changes.
  $rootScope.$on('$routeUpdate', mySvc.updateHandler);

我正在使用Jasmine进行测试和模拟。这就是我现在想出来的

describe('myService', function(){
  var rootScope, target;
  beforeEach(function(){
    rootScope = jasmine.createSpyObj('rootScope', ['$on']);

    module('myModule');
    angular.module('Mocks', []).service('$rootScope', rootScope );
    inject(function(myService){
      target = myService;
    });        
  });

  it('should be defined', function(){
    expect(target).toBeDefined();
  });

  it('should have an empty list of params', function(){
    expect(target.params).toEqual({});
  });

  it('should have called rootScope.$on', function(){
    expect(rootScope.$on).toHaveBeenCalled();
  });
});

但这不起作用。我的rootcope mock并没有取代原版,而依赖注入文档让我更加困惑。

请帮忙

2 个答案:

答案 0 :(得分:7)

我会窥探实际的$ rootScope而不是尝试注入你自己的自定义对象。

var target, rootScope;
beforeEach(inject(function($rootScope) {
  rootScope = $rootScope;

  // Mock everything here
  spyOn(rootScope, "$on")
}));

beforeEach(inject(function(myService) {
  target = myService;
}));

it('should have called rootScope.$on', function(){
  expect(rootScope.$on).toHaveBeenCalled();
});

我已经在CoffeScript中对此进行了测试,但上面的代码仍然有用。

答案 1 :(得分:0)

您可以创建一个RootController,然后将其注入:

inject(function(myService, $controller){
  target = myService;
  $controller('rootController', {
        $scope : $rootScope.$new(),
        $rootScope : myService
  });
});  

使用这种方法,您可以从“myService”访问$ rootScope函数; 这样的'myService。$ on()'

我刚做完,请告诉我是否需要帮助。