2014-03-28 9 views
3

나는 이런 식으로 서비스를 받았다.

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

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

}); 

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

내가 결국 테스트

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

누군가가 내가 부족 어떤 개념을 나에게 설명 할 수 점점? 나는 단위 테스트 서비스가 매우 어렵다는 것을 알고 있습니다.

답변

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'); 
    }); 
    }); 
}); 
관련 문제