글쎄, 하루 정도를 보냈다. 이것에 대한 해결책을 찾고자했다. 나는 더 현명하다는 것을 모른다. 그래서 나는 분해해서 물어보기로했다. . 또한, 나는 새로운 각도에있어 인내심을 얻었습니다.
원격 서버에서 업데이트 된 판사 점수를 검색하기 위해 컨트롤러에서 주기적으로 호출되는 서비스가 있습니다. 꽤 표준적인 것들. 오류 핸들러와 간격을 취소하지 않고 등
$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 한 것처럼 보이고, 실패 할 다른 테스트 (거절을 기대하는)를 일으켰습니다.
그래서 나는 무엇이 누락 되었습니까? 여기 트릭은 뭐니? 나는 코드를 그대로 사용하여 눈에서 비늘을 제거하는 것뿐만 아니라 다른 솔루션 (지연을 사용하지 않음)을 사용할 수 있습니다.