2014-10-14 3 views
0

이 테스트 코드 내의 체인이 해결되지 않음 ... 레벨 1과 레벨 2를 해결합니다. 이 야해 작업 ... :-(플러시 타임 아웃 후 약속을 반환하는 연결 기능이 해결되지 않음

... 그리고 내가이 요청 내부에 너무 많은 코드를 가지고처럼 해달라고 유래 이유

it('Three level promise', inject(function ($q, $timeout, $rootScope) { 
     var plusOne = function(value) { 
      var deferred = $q.defer(); 
      $timeout(function() { 
       deferred.resolve(value+1); 
      }, 10); 
      return deferred.promise; 
     } 

     var promiseCall = function() { 
      return plusOne(1).then(function (data){ 
       console.error('call1 resolved', data); 
       return plusOne(data).then(function (data2){ 
        console.error('call2 resolved', data2); 
        return plusOne(data2).then(function (data3){ 
         console.error('call3 resolved', data3); 
          return data3; 
        }); 
       }); 
      }); 
     } 

     var result; 

     promiseCall().then(function (data) { 
      result = data; 
     }); 

     $timeout.flush(); // Force timeout to be flushed. 

     expect(result).toBe(3); 
    })); 

나는 볼 수 없습니다

+0

그래서'call3 resolved' 로그 나 테스트가 실패하지 않습니까? – dfsq

+0

왜'console.log' 대신 성공 핸들러에서'console.error'를 사용하고 있습니까? – Bergi

+0

'result'가'undefined'라고 기대하십시오. 'promiseCall(). then (function() {...})'안에'expect()'를 이동시키고'data'가'NaN' ('undefined + 1')이 될 것으로 기대하십시오. 그런 다음 각각의 함수에서'data'와'data2'를 리턴하고'data'는'4' (1 + 1 + 1 + 1)이 될 것으로 기대합니다. –

답변

0

두 가지 문제를 :.

$timeout.flush();은 첫 번째 $timeout 통화를 플러시합니다. 다른 두 통화는 아직 통화되지 않았으므로 $timeout.flush(); 번을 한 번만 호출하는 것이 아니라 세 번 호출해야합니다.

두 번째 : 예상 결과는 3이 아니지만 4입니다. 1로 시작하고 확인 된 값은 항상 +1입니다. 당신은 세 번이나 결심합니다.