你如何在angularjs服务中模拟$ rootScope?

awe*_*son 3 unit-testing angularjs angularjs-service

鉴于我有这样的服务.

angular.module('app')
  .factory('Session', function Session($rootScope, $cookieStore) {
    var user;

    if (user = $cookieStore.get('user')) {
      $rootScope.currentUser = user;
    }

});
Run Code Online (Sandbox Code Playgroud)

和测试

'use strict';

describe('Service: Session', function () {
  var Session,
    _rootScope,
    _cookieStore;

  beforeEach(module('app'));

  beforeEach(module(function($provide, $injector) {
    _rootScope = $injector.get('$rootScope').$new();
    _cookieStore = {
      get: angular.noop
    };
    $provide.value('$rootScope', _rootScope);
    $provide.value('$cookieStore', _cookieStore);
  }));

  beforeEach(inject(function(_Session_) {
    Session = _Session_;
  }));

  it('transfers the cookie under user into the currentUser', function() {
    spyOn(_cookieStore, 'get').andReturn('user');
    inject(function(_Session_) {
      Session = _Session_;
    });
    expect(_rootScope.currentUser).toEqual('user');
  });
});
Run Code Online (Sandbox Code Playgroud)

我最终得到了

Error: [$injector:unpr] Unknown provider: $rootScope
http://errors.angularjs.org/1.2.6/$injector/unpr?p0=%24rootScope
Run Code Online (Sandbox Code Playgroud)

有人能向我解释我错过了什么概念吗?我发现单元测试服务非常困难.

awe*_*son 5

诀窍是使用$ injector在特定时刻显式实例化服务.(感谢您的帮助@caitp)

'use strict';

describe('Service: Session', function () {
  var _cookieStore;

  beforeEach(module('rallyApp'));

  beforeEach(module(function($provide) {
    _cookieStore = {
      get: angular.noop
    };
    $provide.value('$cookieStore', _cookieStore);
  }));

  it('transfers the cookie under user into the currentUser', function() {
    inject(function($rootScope, $injector) {
      spyOn(_cookieStore, 'get').andReturn('caitp');
      $injector.get('Session');
      expect($rootScope.currentUser).toBe('caitp');
    });
  });
});
Run Code Online (Sandbox Code Playgroud)