2015-02-03 7 views
7

Possiedo un servizio AngularJS che esegue una richiesta GET $ http e memorizza la risposta nella cache localmente. È progettato per gestire più chiamate contemporaneamente, in modo tale che solo i dati della chiamata finale vengano memorizzati nella cache.

In particolare, se si verifica quanto segue:

  • Richiesta A introduttiva
  • Richiesta B introduttiva
  • Richiesta B completati
  • Richiesta A Completato

Il risultato è che la risposta della richiesta B è memorizzato nella cache, perché è stato avviato per ultimo.

Tuttavia, sto riscontrando dei problemi con il test dell'unità in Jasmine.

Posso impostare due aspettative $ httpBackend.expectGET(), ma posso solo svuotarle nell'ordine in cui sono richieste.

In sostanza ho bisogno di essere in grado di così qualcosa di simile:

$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); 

Qualcuno può suggerire un modo pulito per raggiungere questo obiettivo?

+0

Forse puoi giocare con la proprietà count https://docs.angularjs.org/api/ngMock/service/$httpBackend#flush ma non penso che sia sufficiente –

+0

Sfortunatamente la documentazione dice specificatamente del conteggio proprietà che specifica il "Numero di risposte da scaricare (nell'ordine in cui sono arrivate)". Sospetto che dovrò fare qualcosa di intelligente con le spie per cambiare il comportamento di $ http o $ httpBackend in qualche modo. –

risposta

2

Ho risolto questo problema estraendo le chiamate HTTP in semplici stub. Ciò mi ha permesso di rimuovere $ http dal servizio e $ httpBackend dai test unitari, e invece prendere in giro gli stub per restituire promesse che potrei risolvere in qualsiasi ordine.

+3

Mi interessa una versione più dettagliata della soluzione: potresti condividere uno snippet di codice? –

Problemi correlati