내 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
을 호출하는 것 같지 않습니다.
전체 오류 메시지를 호출 스택에 게시하면 도움이 될 수 있습니다. 나는 '무한한 다이제스트 (infinite digest)'라고 울부 짖을 부분이 보이지 않는다. 이'module ($ provide => $ provide.factory ...)'는 좋지 않습니다. Angular는'config' 블록이 아무것도 반환하지 않는 것을 좋아합니다. 'UserService'는 서비스가 아니며 의존성에 접근 할 수 없으며,'undefined'이어야합니다. 나는 Sinon에게 비 앵귤러 HTTP 조롱을 제안 할 것이다. – estus
@estus 제안에 감사드립니다. 더 많은 연구를 통해이 코드는 실제로 여기에있는 코드의 일부는 아니지만 별도의 서비스 인 .run 및 ui-router와 관련이 있다는 것을 알게되었습니다. 비 앵귤러 HTTP 조롱에 sinon을 사용하는 예가 있습니까? –
@estus 또한'UserService가 서비스가 아니며 의존성에 접근 할 수 없다는 의미가 무엇인지 이해하지 못한다. '... 나는 테스트에서'UserService'를 삽입 한 부분을 포함하지 않았지만 해야 할 것. –