我一直在尝试测试一项服务无济于事,并希望获得一些帮助。这是我的情况:

我有一个服务,看起来像这样

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;

}]);

我想在将服务注入(inject)测试之前模拟注入(inject)'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();
  });
});

但是,这不起作用。我的rootscope模拟并未取代原始版本,并且依赖注入(inject)文档使我比其他任何事情都更加困惑。

请帮忙

最佳答案

我会监视实际的$ rootScope而不是尝试注入(inject)自己的自定义对象。

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中进行了测试,但是上面的代码仍然可以使用。

10-07 19:26
查看更多