2013-06-15 8 views
4

다른 서비스에 의존하는 AngularJS에서 간단한 서비스를 테스트하는 데 문제가 있습니다. 난 그냥 대신 서비스를 만드는 window.location.pathname를 사용하려고 시작에서의존성이있는 AngularJS 서비스 테스트

serviceModule.factory('filtersService', ['$rootScope', 'urlService', function($rootScope, urlService){ 
     return { 
      getFilters: function(){ 
        if(urlService.getPathName() == "test") 
        { 
         return "something"; 
       } 
    }]); 

하지만 잘못된 방법처럼 보였다 조롱 할 수 있도록 :

서비스는이 같은 비트 보이는 그것. 따라서 urlService를 만들었는데, 기본적으로 window-object를 둘러싼 간단한 래퍼입니다.

나는 다음과 같습니다 내 filtersServiceTest 있습니다

describe('filtersService test', function(){ 
    var filtersService, urlServiceMock; 

    beforeEach(module('App.services')); 

    beforeEach(function(){ 
     urlServiceMock = { 
      getPathName: function(){ 
       return ""; 
      } 
     }; 

     module(function($provide){ 
      $provide.value('urlService', urlServiceMock); 
     }); 
    }); 

    it('Should return something if url is test', inject(function(filtersService){ 
     urlServiceMock = { 
      getPathName: function(){ 
       return "test"; 
      } 
     }; 

     expect(filtersService.getFilters()).not.toBe("something"); 
    })); 
}); 

을하지만이 작동하지 않습니다. 실제로 실행되기 전에 urlServiceMock을 오버로드 할 수 없습니다. 'beforeEach'을 각각 변경할 수 있으므로 getPathName은 "test"를 반환하지만 URL이 테스트와 동일하지 않은 위치를 테스트 할 수는 없습니다.

답변

0

당신은 행동 변화 테스트 스위트의 서비스를 감시 할 수 있습니다 http://jsfiddle.net/robinroestenburg/aDwva/

당신이 얻을 수 있도록해야합니다

spyOn(yourService, 'methodName'); 

스파이를 구현하는 방법에 jsFiddle에 대한 좋은 예는이를 그것은 올바르게 작동합니다.

+7

참조 된 jsfiddle이 누락되었습니다. – jeriley

+0

Fiddle is broken –

+0

The fiddle 404ed. – Stephane

관련 문제