7

一段时间以来,我一直在尝试测试一项服务无济于事,希望能得到一些帮助。这是我的情况:

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

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();
  });
});

但这不起作用。我的 rootscope 模拟并没有取代原来的模拟,而依赖注入文档最让我感到困惑。

请帮忙

4

2 回答 2

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 中对此进行了测试,但上面的代码应该仍然可以工作。

于 2013-04-16T13:52:32.133 回答
0

您可以创建一个 RootController 然后注入它:

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

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

我刚刚成功,如果需要帮助,请告诉我。

于 2013-10-31T17:30:16.413 回答