2016-09-21 3 views
0

Promise를 호출하는 범위 함수에 대한 테스트를 작성하고 있으며 약속 해결 후 설정된 일부 범위 속성에 액세스하려고합니다.Jasmine으로 약속을 호출하는 테스트 범위 함수

이 기본적으로 내 컨트롤러 기능입니다 :

범위 함수를 호출 한 후, 내 $scope.message이 잘 살고있다, 경우입니다 내가 꽤 많이 테스트 할
$scope.submitNewForm = function(){ 
    Service.createUser($scope.user).then(function(result){ 
     if (result){ 
      $scope.message = 'success'; 
     } else { 
      $scope.message = 'error'; 
     } 
     $scope.$apply(); 
    }); 
}; 

.

지금까지 내가 $q.defer()를 사용하여 몇 가지 테스트를했지만 저는 누락 된 것에 더 성공

beforeEach(inject(function ($controller, $rootScope, _Service_, $q) { 
    scope = $rootScope.$new(); 
    Service= _Service_; 
    deferred = $q.defer(); 
    UserController= $controller('UserController', { 
     $scope: scope 
    }); 
})); 

it('should call Service.createUser and set a message', function(){ 
    spyOn(Service, 'createUser').and.callFake(function() { 
     return deferred.promise; 
    }); 
    scope.submitNewForm(); 
    scope.$digest(); 
    expect(scope.message).toBeDefined(); 
}); 

어떤 아이디어가 없었나요?

답변

1

그럼 테스트를 실행하는 중에 이런 종류의 오류가 발생할 수 있습니다. 당신은 단순히 당신이 ServicecreateUser 방법에 생성 된 spy에서 promise을 반환했기 때문에

Error on running the test

는 우물입니다.

문제를 해결하려면 어떻게해야합니까? spy 안에 deferred.reject 또는 deferred.resolve을 입력하면 scope.message이 정의됩니다. 다음과 같은 내용이 있습니다.

spyOn(Service, 'createUser').and.callFake(function() { 
    deferred.resolve('success'); 
    return deferred.promise; 
}); 

또한 제안 할 것이 하나 더 있습니다. 모든 스파이를 beforeEach 블록 안에 넣고 서비스를 주입하고 controller 객체를 모의 촬영해야합니다. 그렇게하면 재사용 할 수 있습니다.

UPDATE :이 작동하는지

it('should call Service.createUser and set a message', function(){ 
    scope.submitNewForm(); 
    scope.$$postDigest(function(){ 
     scope.$digest(); 
     expect(scope.message).toBeDefined(); 
    }); 
}); 

확실하지하지만 일반적으로 수행되는 것입니다 : 이 범위에 대한 변경 사항을 적용하려면, 당신은 이런 식으로 뭔가를 할 수 있습니다.

+0

답변 주셔서 감사합니다. 나는 Promise 콜백 내에서'$ scope. $ apply()'를 호출했기 때문에 이미'Error : [$ rootScope : inprog] $ digest가 진행 중입니다. 하지만 내 생각에 변화를 적용해야합니다. 이견있는 사람? – adolfosrs

관련 문제