웹사이트 검색

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();
 });
});