2017-09-26 5 views
0

그래서 내 공장에서는 HTTP 호출을 요청하고이를 약속 배열에 추가하는 루프가 있습니다. 그런 다음 결과를 $q.all으로 작성하여 모델을 작성하십시오. 그러나 테스트 할 때 HTTP를 사용하여 모든 호출을 수행 할 수는 없지만 마지막 호출 만 수행하므로 모든 호출을 수행하고 모델을 작성해야합니다. 아래 매우 (I 7 날짜를 사용하지만, 짧은 일을 계속하고 싶어) 코드를 줄일 나는 이것을 테스트하기 위해 올 때단위 테스트 다중 HTTP 요청

function getLatestData(){ 
    var dateArray= ['2017-09-21','2017-09-22'] 
    for (i = 0; i < 2; i++) { 
     var url = 'data-server/date/[i]'            
     promises.push(getData(url)); // getData is a simple $http function call. 
    } 
    return $q.all(promises).then(function(response){ 
    buildModel(reponse); 
    }); 
} 

그래서

공장 코드, 내가 좋아하는 뭔가를 가지고있다 (루프를 시도했지만 실패했습니다.)

httpBackend.expectGET('data-server/date/2017-09-21').respond(mockData[0]); httpBackend.expectGET('data-server/date/2017-09-22').respond(mockData[1]); rootScope.$apply(); modelFactory.getLatestData().then(function(response){ expect(response).toEqual(mockModelData); }) 

은 그래서 GET URL을 CONSOLE.LOG 나는 그것을 항상이기 때문에 그들이이 오류

Error: Unexpected request: GET 'data-server/date/2017-09-22' 
Expected GET 'data-server/date/2017-09-21' 

결과 업데이트로하지 않는 것, 모든 URL 요청이 동일한 참조 마지막으로 httpBackend.expectGET이 찍혔습니다.

무엇이 누락 되었습니까?

답변

0

내 문제는 조롱입니다. 필자는 필자가 필자가 생각하기에 필자는 이것이 적합하지 않다고 생각하고 합병증을 추가했지만 필자는 순간 JS 라이브러리를 사용한 날짜를 작성했기 때문에 이것을 버렸다.

그렇게

var url = 'data-server/date/[i]' 

var url = 'data-server/date/'+factory.getMoment().add(i,'d').format('YYYY-MM-DD'); 

factory.getMoment, 나는 이상 단위 테스트에서이 탈 수있는 생각은 '주어진 날을 제공하기 위해 잠시 단지 래퍼입니다 '날짜 개체. 내 테스트에서 어쨌든

funciton getMoment(){ 
    return moment(); 
} 

, 나는이 호출 될 때마다, 그것은이 모의을 내게 돌려 줄 것이라고 생각이

var mockDate = moment('2017-09-21'); 
spyOn(factory, 'getMoment').and.returnValue(moment('2017-09-21')); 

httpBackend.expectGET('data-server/date/'+mockDate.format('YYYY-MM-DD').respond(mockData[0]); 
httpBackend.expectGET('data-server/date/'+mockDate.add(1,'d').format('YYYY-MM-DD').respond(mockData[1]); 

했다 그것에 대해 잘못 생각한다.

동료가 지적한대로 내가해야 할 일은 jasmine's clock mock입니다.

beforeEach(function() { 
    jasmine.clock().install(); 
}) 
afterEach(function() { 
    jasmine.clock().uninstall(); 
}) 

그런 다음 내 테스트에서 나는 내 스파이를 제거했습니다

mockDate = moment('2017-09-21'); // always use moment as JS date if badly broken and just can't be trusted! 
jasmine.clock().mockDate(mockDate.toDate()); 

httpBackend.expectGET('data-server/date/'+moment().add(0, 'days').format("YYYY-MM-DD").respond(mockData[0]);; 
httpBackend.expectGET('data-server/date/'+moment().add(1, 'days').format("YYYY-MM-DD").respond(mockData[1]);; 

(위의 루프에)와 날짜 시간을 설정하고 지금은 날짜를 가지고 요청한대로 작동합니다.

희망 사항은 테스트가 작동하지 않는 이유를 알아 내려고 며칠 동안 머리를 긁적 거리는 다른 사람들에게 도움이되기를 바랍니다.