2016-07-11 9 views
0

내 ApiService를 호출하는 UserService에 대한 간단한 테스트가 있습니다. 그래서 내가 직접 $httpBackend을 사용할 수 없습니다 타사 API SDK를 사용하고 있지만, 적어도 지금은 빈 데이터는 API에서 반환 될 수 있도록 내가 설정 한 :

// ApiService mock 
beforeEach(module($provide => 
    $provide.factory("ApiService", $q => ({ 
     request:() => $q.resolve({data: {}}), 
    })) 
)); 

// Test 
describe("registerUser",() => { 
    it("registers user",() => { 
     const registerId = "registerId"; 
     $window.SDK = {credentials: {registerId}}; 

     UserService.registerUser("socialId", "email"); 
     $rootScope.$apply(); 

     expect(UserService.registerId).to.equal(registerId); 
    }); 
}); 

// Implementation 
function UserService(ApiService, $window) { 
    let service = {}; 
    service.registerUser = (socialId, email) => { 
     return ApiService.request("registerUser", {socialId, email}).then(response => { 
      service.registerId = $window.SDK.credentials.registerId; 
     }); 
    }; 
    return service; 
} 

본질적으로 UserService 통화 SDK를 호출하는 ApiService. UserService에 설정된 내부 registerId을 설정합니다.

약속을 해결하기 위해 $rootScope.$apply을 사용하고 있습니다. 사실 제가 전화를 걸면 registerId이 적절하게 설정되었음을 확인합니다. 나는 약속이 해결되지 않습니다 및 registerId가 설정되지 없구요 $rootScope.$apply를 사용하지 않는 경우 그러나, 나는

[$rootScope:infdig] 10 $digest() iterations reached. Aborting!를 얻을.

약속을 해결하거나이 API를 모방하는 다른 방법이 있습니까? 일반적으로 무한 다이제스트주기를 일으키는 요소를 올바르게 디버그하려면 어떻게해야합니까? $rootScope.$apply? 루프에서 registerUser을 호출하는 것 같지 않습니다.

+0

전체 오류 메시지를 호출 스택에 게시하면 도움이 될 수 있습니다. 나는 '무한한 다이제스트 (infinite digest)'라고 울부 짖을 부분이 보이지 않는다. 이'module ($ provide => $ provide.factory ...)'는 좋지 않습니다. Angular는'config' 블록이 아무것도 반환하지 않는 것을 좋아합니다. 'UserService'는 서비스가 아니며 의존성에 접근 할 수 없으며,'undefined'이어야합니다. 나는 Sinon에게 비 앵귤러 HTTP 조롱을 제안 할 것이다. – estus

+0

@estus 제안에 감사드립니다. 더 많은 연구를 통해이 코드는 실제로 여기에있는 코드의 일부는 아니지만 별도의 서비스 인 .run 및 ui-router와 관련이 있다는 것을 알게되었습니다. 비 앵귤러 HTTP 조롱에 sinon을 사용하는 예가 있습니까? –

+0

@estus 또한'UserService가 서비스가 아니며 의존성에 접근 할 수 없다는 의미가 무엇인지 이해하지 못한다. '... 나는 테스트에서'UserService'를 삽입 한 부분을 포함하지 않았지만 해야 할 것. –

답변

1

진정한 가해자는 관련성이없는 코드에 위치 할 수 있으며, 라우터는 무한한 다이제스트에 가장 많이 기여합니다.

단위 테스트는 단위가 다른 움직이는 부분과 분리되어 테스트되는 것으로 가정합니다. 라우터 관련 모듈을 라우터 테스트에 포함되지 않은 사양으로로드하지 않는 것이 좋습니다 (전체 응용 프로그램에 영향을주는 다른 모든 장치에도 동일하게 적용됩니다). 라우팅 모듈 (예컨대 app.router)는 라우터 모듈 (ui.router 또는 ngRoute)에 따라 단지 상부 모듈 (app)로 로딩 될 수있다이 경우

아닌 타인.

app.router 유닛 자체의 라우팅을 설정하고 행 정의 ($routeProvider.when 등)에 사용되며, 감시 수단 (ngRouter 경우 $routeProvider)를 라우터 제공자 조롱하여 테스트 configrun 블록을 포함 할 수있다.

관련 문제