2015-02-03 2 views
7

$ http GET 요청을 수행하고 로컬에서 응답을 캐시하는 AngularJS 서비스가 있습니다. 이 기능은 동시에 발생하는 여러 통화를 처리하도록 설계되어 최종 통화의 데이터 만 캐시됩니다. 다음 생기면

구체적 :

  • 요청은
  • 요청의 B는 응답이다
  • 요청 완료

결과 완료

  • 요청 B 시작 시작 요청 B가 마지막으로 시작 되었기 때문에 캐시됩니다.

    그러나 재스민에서이 문제를 테스트하는 데 문제가 있습니다.

    두 개의 $ httpBackend.expectGET() 기대를 설정할 수 있지만 요청 된 순서 대로만 플러시 할 수 있습니다.

    $httpBackend.expectGET('/one').respond(200, data1); 
    $httpBackend.expectGET('/two').respond(200, data2); 
    
    myService.doSomething('/one'); 
    myService.doSomething('/two'); 
    
    $httpBackend.flush('/two'); 
    $httpBackend.flush('/one'); 
    
    expect(myService.data).toBe(data2); 
    

    사람이 이것을 달성 할 수있는 깔끔한 방법을 제안 할 수 있습니다 :

    은 기본적으로 그래서 이런 일을 할 수 있어야합니다?

  • +0

    아마 카운트 속성 https://docs.angularjs.org/api/ngMock/service/$httpBackend#flush로 재생할 수 있지만 충분하지 않을 것이라고 생각합니다. –

    +0

    불행히도 설명서에 카운트에 대한 구체적 내용이 나와 있습니다. "플러시 할 응답 수 (도착한 순서대로)"를 지정하는 속성 어떤 방식 으로든 $ http 또는 $ httpBackend의 동작을 변경하려면 스파이와 똑똑한 무언가를해야 할 것으로 판단됩니다. –

    답변

    2

    HTTP 호출을 간단한 스텁으로 추출하여이 문제를 해결했습니다. 이를 통해 서비스에서 $ http를 제거하고 유닛 테스트에서 $ httpBackend를 제거하고 스텁을 모방하여 임의의 순서로 해결할 수있는 약속을 반환 할 수있었습니다.

    +3

    솔루션의 더 자세한 버전에 관심이 있습니다. 코드 스 니펫을 공유 할 수 있습니까? –