javascript - AngularJS/Karma - 해결되거나 거부된 프라미스를 반환하는 함수 테스트
내 함수가 거부된 프라미스를 반환했을 때 AngularMock과 함께 Karma에서 단위 테스트를 시도하고 있지만, 이와 관련된 내용을 전혀 찾을 수 없는 것이 놀랍다.
저는 UserService와 같은 서비스를 가지고 있으며, 이 서비스에는 processIdentityResponse라는 함수가 있습니다. 이 함수는 내부 로직에 따라 성공(resolve)하거나 실패(reject)하는 프로미스를 반환합니다:
processIdentityResponse: function(response)
{
var deferred = $q.defer();
if (response.data.banned) {
deferred.reject(response);
} else {
deferred.resolve(response);
}
return deferred.promise;
}
나는 금지된 속성이 존재하면 거부된 프라미스가 반환되고, 존재하지 않으면 해결되는지 테스트하고 싶습니다... 어떻게 하면 이를 달성할 수 있을까요?
나는 다음과 같은 것을 시도했지만 성공하지 못했습니다:
it('should return a rejected promise if status is a string', function() {
var rejected = false;
UserService.processIdentityResponse(data).catch(function() {
rejected = true;
});
expect(rejected).toBe(true);
});
답변 #1
그 이유는 약속이 아직 해결되지 않았기 때문인 것 같습니다. 이는 비동기 기능이기 때문입니다.
기본적으로 이후에 다음과 같이 $rootScope.$digest()를 호출해야 합니다:
it('should return a rejected promise if status is a string', inject(function($rootScope) {
var rejected = false;
UserService.processIdentityResponse(data).catch(function() {
rejected = true;
});
$rootScope.$digest();
expect(rejected).toBe(true);
}));
답변 #2
도미닉이 말한 것에 덧붙여, 저는 자스민 done() 비동기 지원 함수를 사용했습니다. 이를 일시 정지/대기 함수로 생각하면 됩니다.
describe('my description',function(){
beforeEach(function(done){
var rejected = true;
var promise = UserService.processIdentityResponse(data);//add ur service or function that will return a promise here
setTimeout(function(){done();},1500);//set time to 1500ms or more if it's a long request
});
it('it should be true',function(done){
promise.catch(function(){ rejected=true});
$rootScope.$digest();//important
expect(rejected).toBeTruthy();
done();
});
});
