2014-12-16 2 views
1

클라이언트의 데이터와 상호 작용하고 서버를 호출하지 않는 여러 비동기 메서드를 실행해야하는 컨트롤러가 있습니다. 브라우저에서 제대로 작동하는 한 가지 방법이 있지만 테스트를 통해 메서드를 실행하고 테스트 환경 (Karma 및 Mocha)에서 작동하도록 할 수 없습니다. 그 이유는 $ resource.query()가 반환하는 빈 배열은 약속이 해결되지 않기 때문에 테스트 환경에서 결코 채워지지 않기 때문입니다. 테스트 스위트에서 내 앞 부분이 있습니다.

beforeEach(inject(function($rootScope, $controller, scheduleService){ 
    scope = $rootScope.$new(); 
    sc = $controller('scheduleCtrl', { 
     $scope: scope, service: scheduleService 
    }); 
    scope.$apply(); 
    })); 

scheduleCtrl 그것의 생성자 Resource.query 결과()에 할당 된 속성 스케줄을 갖는다. 반환 된 세 객체가 MockHttpExpectation에로드 된 것을 볼 수 있습니다.

enter image description here

하지만 테스트 sc.schedule는 여전히 비어있는 배열입니다 실행으로 이동, 그래서 테스트가 실패 할 때. 테스트에서 해결할 Resource.query()를 얻으려면 어떻게해야합니까?

답변

0

Resource.query()는 assync 프로세스 인 promisses와 함께 작동합니다.

비동기 요청이 완료되기 전에 그리고 배열이 채워지기 전에 테스트가 실행되는 경우가 발생합니다.

$ httpBackend.flush() 후에 expect를 호출 할 수 있도록 $ httpBackend를 사용할 수 있습니다.

또는 Resource.query(). $ promisse에서 반환 한 $ promisse를 테스트에서 가져 와서 구현 내에서 기대할 수 있습니다.

예 :

$scope.promisse = Resource.query().$promisse; 

sc.promisse(function(values) { 
    expect(values.length).not.toBe(0); 
}); 
+0

나는 $ httpBackend 사용합니다. 브라우저에 데이터를 가져 오는 데는 문제가 없습니다. 테스트에서 & httpBackend.flush()를 사용하면 플러시 할 것이 없다는 오류가 발생합니다. – pthalacker

+0

나는 약속의 그때의 방법 안에 기대를 동봉 할 때, 항상 통과한다. 그러나 동일한 메소드 내부의 console.writeline은 값 (예제에서)은 정의되지 않는다고 말합니다. – pthalacker