2017-07-27 3 views
4

Ich versuche, einen Beispieleinheitstest mit Observable.interval in RxJs Version 5 zu schreiben. Ich führe den folgenden Code aus, aber meine Observable feuert nur einmal, nicht 20 Mal, wie erwartet.Wie bekomme ich TestScheduler in RxJs5?

it('does its interval thing synchonously',()=> { 

     let x = []; 
     let scheduler = new Rx.TestScheduler(); 
     let interval$ = Rx.Observable.interval(500, scheduler).take(20); 

     interval$.subscribe(
      value => { 
       x.push(value); 
       console.log(value) 
      }, 
     ); 

     for(let i = 0; i < 20; i++) { 
      scheduler.flush(); 
     } 

     expect(x.length).toBe(20); 

    }); 

Wie kann ich meine TestScheduler die beobachtbaren vorwärts von 10000 Millisekunden bewegen machen?

Antwort

3

Mein Verständnis ist, dass die TestScheduler soll mit marble testing verwendet werden und arbeitet mit von denjenigen zusammengesetzt Observablen zurück durch seine createColdObservable und createHotObservable Methoden.

Stattdessen könnten Sie die VirtualTimeScheduler verwenden - auf dem das TestScheduler basiert:

let scheduler = new Rx.VirtualTimeScheduler(); 
 
let interval$ = Rx.Observable.interval(500, scheduler).take(20); 
 

 
let values = []; 
 
interval$.subscribe(value => values.push(value)); 
 

 
scheduler.flush(); 
 
console.log(values);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

Beachten Sie, dass nur ein einziger flush Anruf erforderlich ist.