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.
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');
});
});
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With