2015-01-13 4 views
1

AngularJS 애플리케이션을 구축 중이며 단위 테스트를 시도하고 있습니다. 난 진짜 의존성 대신 모의 서비스를 주입하고 싶다.조롱 된 공장을 사용하여 Jasmine에서 중첩 된 약속을 테스트합니다.

.factory('LoginService',['Login', function(Login){ 
    return { 
     getActiveUser: function() { 
      return Login.query({}).$promise.then(
       function (users) { 
        return users[0]; 
       }, 
       function (error) { 
        console.log(error); 
       } 
      ); 
     } 
    }; 
}]); 

그것은 모든 사용자 목록에서 첫 번째 사용자를 반환하는 간단한 서비스입니다 :

내가 테스트를 시도하고있는 서비스입니다. 벨로우 (Bellow)는 mock으로 단위 테스트를 작성하려는 시도이지만 성공하지 못합니다.

.... 
beforeEach(module('loginModule', function($provide) { 

    mockedService = { 
     getActiveUser: function() { 
      return { 
       then: function(callback) { 
        return callback({name: 'John'}); 
       } 
      }; 
     } 
    }; 

    $provide.value('LoginService', mockedService); 

})); 

beforeEach(inject(function (_LoginService_, _Login_, _$httpBackend_, $rootScope) { 
    LoginService = _LoginService_; 
    Login = _Login_; 
    scope = $rootScope; 
    httpBackend = _$httpBackend_; 

    spyOn(mockedService, 'getActiveEnvironment').andCallThrough(); 
})); 

describe('getActiveUser', function() { 
    it('should call the function', function() { 
     LoginService.getActiveUser(); 
     expect(mockedService.getActiveUser).toHaveBeenCalled(); 
    }); 

    it('should return active user', function() { 
     var user = {}; 

     mockedService.getActiveUser().then(
      function (env) { 
       user = env; 
      } 
     ) 

     expect(user.name).toBe("John"); 

    }); 
}); 

스파이를 사용하고 직접 서비스 방법을 주입하는 테스트 패스를 만들 수있었습니다. 이제 나는 같은 것을 달성하기를 원하지만 조롱 된 인스턴스로. 첫 번째 테스트는 통과하지만 두 번째 테스트는 실패합니다. 누구나 아이디어가 있습니까? 모의 서비스에

답변

1

에 한번이 방법 :

spyOn(mockedService, 'getActiveUser').and.callThrough(); 

및 살전에 당신이 또한

mockedService.getActiveUser().then(function(env) { 
    user = env; 
}); 

수동으로 만들 수 있습니다 실행됩니다 :

mockedService = { 
    getActiveUser: function() { 
     return $q.when({username: 'Thomas'}); 
    } 
} 

그때 당신이 그것을 감시 할 수 약속과 같은 API :

나는 점점 오전이 경우
+0

: mockedService.getActiveUsee.then (...) 거 야 이제 질문을 수정 – Sanja

+0

당신이 메서드를 호출해야합니다 : UNDEFINE는 다음 줄에서 함수가 아닙니다'mockedService .getActiveUser()',주의 (')'. 일반적으로 원래의 접근 방식은 올바르지 않습니다 :'mockedService.getActiveUser.then ...'. 모의 서비스의 API는 실제 서비스와 일치하지 않았습니다. 이제 실제 서비스가 있어야합니다. 앱에서와 같이'getActiveUser() '를 호출해야합니다. – dfsq

+0

또한'$ q.when ({username : 'Thomas'});'버전을 사용하는 것이 좋습니다. – dfsq

관련 문제