javascript - Spesifikasjonen har ingen forventninger - Jasmine tester tilbakekallingsfunksjonen


Jeg har en metode som blir kalt ved bruk av en d3 timer. Hver gang metoden blir kalt, sender metoden ut et objekt med noen verdier. En av verdiene øker over tid. Jeg ønsker å skrive en test for å sjekke om verdiene er i stigende rekkefølge eller ikke (dvs. om de øker over tid eller ikke).

Så, for å takle dette, i testen min abonnerer jeg på hendelsesutløseren, og inne i abonnementet skyver jeg objektet jeg mottar inn i et lokalt array. Og så forventer jeg at array[i] er mindre enn array[i+1]. Jeg tror logikken min er helt korrekt, men jeg er ikke sikker på hvorfor jeg får en feil fra Jasmine som sier at spesifikasjonen har ingen forventninger selv om jeg har en.

Her er koden:

let x = d3.timer((elapsed) => { 
    this.method(); // call the function
    if(elapsed >= 500) {
     x.stop(); // stops the timer.
    }
});

method(elapsed) {
 // do something
 if(elapsed > 500) {
   this.output.emit({x: somevalue, y: somevalue, f: increasingvalue });
 }
}

Jasmin-spesifikasjonen:

it('my spec', inject([JumpService], (service: JumpService) =>{
  array = [];
  //service calls the method
  service.output.subscribe(e => {
   array.push(e);
   // A console statement here will give me the length and the object pushed.
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }

  });

}));

Gjør jeg noe galt her? Hvordan kan jeg takle en slik situasjon? Vennligst veiled meg i riktig retning.

Takk.

Svar #1

Generelt, når man tester de asynkrone tilbakekallingsfunksjonene, er det alltid viktig å forvente resultatene av testen etter at løftene er oppfylt. Du kan bruke Angular testbed-rammeverkets tick() sammen med fakeAsync(), eller du kan rett og slett falle tilbake til Jasmines generelle måte å teste de asynkrone metodene på ved å bruke done()

Bruke done():

it('my spec', (done) => {
  array = [];
  service.output.subscribe(e => {
   array.push(e);
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }
   done();
  });
});

Håper dette svaret hjelper.

Merk: Jeg hadde ikke stor lykke med fakeAsync() og tick(), så jeg inkluderer det ikke i svaret. Beklager det.

Svar #2

Prøv å bruke async-funksjonen fra @angular/core/testing. Den

Pakker en testfunksjon inn i en asynkron testzone. Testen vil automatisk fullføres når alle asynkrone kall innenfor denne sonen er ferdige. Kan brukes til å pakke inn et {@link inject}-kall.

Vennligst finn kodeeksempel nedenfor:

it('...', async(inject([AClass], (object) => {
  object.doSomething.then(() => {
   expect(...);
  })
});

Relaterte artikler