Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you mock $rootScope in an angularjs service?

Given i have a service like this.

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

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

});

and a test

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

I end up getting

Error: [$injector:unpr] Unknown provider: $rootScope
http://errors.angularjs.org/1.2.6/$injector/unpr?p0=%24rootScope

Can someone explain to me what concept I'm missing? I'm finding unit testing services to be exceedingly difficult.

like image 477
awesome_person Avatar asked Oct 25 '25 05:10

awesome_person


1 Answers

The trick was to use $injector to explicitly instantiate the service at a specific moment in time. (Thanks for your help @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');
    });
  });
});
like image 96
awesome_person Avatar answered Oct 26 '25 22:10

awesome_person



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!