2016-11-15 10 views
0

글쎄, 하루 정도를 보냈다. 이것에 대한 해결책을 찾고자했다. 나는 더 현명하다는 것을 모른다. 그래서 나는 분해해서 물어보기로했다. . 또한, 나는 새로운 각도에있어 인내심을 얻었습니다.

원격 서버에서 업데이트 된 판사 점수를 검색하기 위해 컨트롤러에서 주기적으로 호출되는 서비스가 있습니다. 꽤 표준적인 것들. 오류 핸들러와 간격을 취소하지 않고 등

$app.service('ResultService', function($http) { 
     var self = this; 
     self.results = {}; 

     self.getResults = function() { 

      return $http.get('/results').then(function(response) { 
       return $q.when(response.data).then(function(data) { 
        angular.copy(self.results, response.data); 
       }; 
      }; 

     }; 
    }); 

    $app.controller('ResultController', function($interval, resultService) { 
     var vm = this; 

     $interval(function() { 
      resultService.getResults().then(function(data) { 
       vm.results = data; 
      }); 
     }, 1000); 
    }); 

모든 좋은 지금까지, 브라우저에서 원하는대로 모든 작품 - 만 관련 코드가 표시됩니다.

테스트를 완료했습니다. 업데이 트가 getResults 함수에 의해 수신되고 처리되는지 확인하고 싶습니다.하지만 지연을 한 번 이상 사용하도록 필요한 닭고기 희생을 수행하는 데 어려움을 겪고 있습니다. 나는 다음과 같이 할 수있을 것이라고 생각했다 :

var deferred; 
beforeEach(inject(function($q, httpBackend) { 
    deferred = $q.defer(); 
    httpBackend.whenGET('/results').respond(deferred.promise); 
}); 

it('updates results', inject(function($interval) { 
    deferred.resolve({some: 'data'}); 
    scope.$digest(); 
    httpBackend.flush(); 
    $interval.flush(1200); 
    // This works fine 
    expect(resultsService.results).toEqual({some: 'data'}); 

    deferred.resolve({other: 'data'}); 
    scope.$digest(); 
    httpBackend.flush(); 
    $interval.flush(1200); 
    // But this of course does not. 
    expect(resultsService.results).toEqual({other: 'data'}); // fails 
}); 

이제 지연된 약속은 한 번만 해결 될 수있다. 그래서 내 질문은, 어떻게 테스트 된 각 반복과 함께 서비스의 $ http.get() 호출에 신선한 데이터를 제공합니까? 나는 성공하지 못한 채 여러 가지를 시도해 보았습니다.

  • 지연된 약속 자체가 만들어졌습니다. 이 방법은 광기 거짓말.
  • httpBackend.whenGET()을 새 응답으로 다시 설정하려고 시도했습니다. 이것은 아무런 효과가 없었다.
  • 간격 반복 사이에서 테스트 내에서 지연된 새 항목을 만들었습니다. 말할 필요도없이 원래의 연기 된 약속이 이미 설정 되었기 때문에 실패했습니다.
  • GET()에서 정적 값을 반환하고 해당 값을 직접 조작했습니다. 불행하게도, 이것이 "효과가있는"동안, 그것은 다소 hackish 한 것처럼 보이고, 실패 할 다른 테스트 (거절을 기대하는)를 일으켰습니다.

그래서 나는 무엇이 누락 되었습니까? 여기 트릭은 뭐니? 나는 코드를 그대로 사용하여 눈에서 비늘을 제거하는 것뿐만 아니라 다른 솔루션 (지연을 사용하지 않음)을 사용할 수 있습니다.

답변

0

이것에 대해서는 너무 확실하지 않지만 다른 누구도 아직 대답하지 않았습니다.

전략 :

  • 한 모의 배열 요소마다 데이터 세트와 data 배열을 정의한다.
  • 패턴을 사용하여 비동기 시퀀스의 각 모의 데이터 세트를 테스트합니다.
  • 시퀀스가 ​​진행됨에 따라 배열에 결과가 누적됩니다.
  • 모든 결과가 수집 될 때 expect()을 비동기 적으로 실행하십시오. 원래 data 배열과 같아야합니다.
  • 아주 100 % 정확 가능성이 있지만 더 아이디어를 자극 할 수
    it('updates results', inject(function($interval) { 
        var dataArray = [ 
         {some: 'data'}, 
         {other: 'data'} 
        ] 
        data.reduce(function(promise, data) { 
         return promise.then(function(resultsArray) { 
          // *** not sure about this section - I just copied and pasted *** 
          deferred.resolve(data); 
          scope.$digest(); 
          httpBackend.flush(); 
          $interval.flush(1200); 
          // *** ****************************************************** *** 
          return resultsArray.concat(resultsService.results); 
         }); 
        }, deferred.resolve([])) // starter promise resolved with an empty results array. 
        .then(function(results) { 
         expect(results).toEqual(dataArray); 
        }); 
    }); 
    

.