2016-09-01 2 views
0

비동기 프로세스가 완료 될 때 테스트 케이스에 $scope.$apply()을 실행하는 것이 의무적 인 이유는 무엇입니까?

내가 서비스를

angular.service("a",function($q){ 
    return { 
     getValue: function(){ 
      return $q.resolve(someObj) 
     } 
    } 
}) 

이 그리고 내 테스트

it("test this",function(done){ 
    a.getValue() 
    .then(function(data){ 
     expect(data).toEqual(data) 
     done(); 
    }) 
    $scope.$apply(); 
}) 

답변

3

그것은 다이제스트주기를 트리거에서 말한다. docs에서

:

약속을 테스트, 그것은 약속의 해상도가 다이제스트주기에 연결되어 있음을 아는 것이 중요합니다. 약속이 성립했다는 것을 의미합니다. catch 및 finally 콜백 함수는 다이제스트 이 실행 된 후에 만 ​​호출됩니다. 테스트에서 범위의 $ apply 함수를 호출하여 다이제스트를 트리거 할 수 있습니다. 테스트에 스코프가없는 경우 $ rootScope를 삽입하고 $ apply를 호출 할 수 있습니다.

http 호출의 경우 $ httpBackend.flush()를 사용합니다.

docs에서 생산에 사용되는 $ httpBackend는 항상 응답하는 비동기 를 요청합니다. 단위 테스트에서이 동작을 유지한다면 은 쓰기가 어려우며 유지 관리하기 위해 을 따르는 비동기 단위 테스트를 만들어야합니다. 그러나 테스트 모의는 에 동 기적으로 응답 할 수 없습니다. 이는 테스트중인 코드의 실행을 변경합니다. 이런 이유로 mock $ httpBackend에는 flush() 메소드가 있으며, 은 테스트가 보류중인 요청을 명시 적으로 플러시하도록합니다. 이렇게하면 백엔드의 비동기 api가 보존되고 테스트에서는 이 동 기적으로 실행됩니다.

+0

답변 주셔서 감사합니다. @scott 범위에서 아무 것도 변경하지 않을 때 약속 시간에 다이제스트주기가 필요한 이유는 무엇입니까? –

+0

이 [post] (http://blog.xebia.com/testing-promises-in-angularjs/)에서 : 약속이 해결되면 해당 콜백이 즉시 호출되지 않습니다. 대신, Angular는 evalAsync 큐에 promise.resolve 콜백을 넣습니다. 대기열이 처리 될 때까지 대기합니다. 그때 만 콜백이 호출됩니다. 대기열을 처리하는 것은 digest() 메소드입니다. – ScottL

관련 문제