2017-09-18 3 views
2

I-Bibliothek bin mit NGRX und dieserNGRX Effektgerät Test mulitple Aktionen in mergemap

einen Effekt wie
@Effect() 
    loadCollection$: Observable<Action> = this.actions$ 
    .ofType(authAction.GET_USER) 
    .startWith(new authAction.GetUserAction()) // call on app load 
    .switchMap(() => 
     this.service.getUser() 
     .mergeMap((user: User) => [ 
      new authAction.GetUserCompleteAction(user), 
      new navigationAction.GetLinksCompleteAction(user.role) 
     ]) 
    ); 

I-Spezifikation für sie schreibe und es sieht aus wie dieses

actions = new ReplaySubject(2); 
     actions.next(new auth.GetUserAction()); 

     effects.loadCollection$.subscribe(result => { 
      expect(service.getUser).toHaveBeenCalled(); 
      expect(result).toEqual(new navigation.GetLinksCompleteAction('test')); --> this line fails 
     }); 

Wie kann ich erwartet, dass mehrere Aktionen in der Zusammenführungskarte aufgerufen wurden.

Antwort

4

Sie können jasmine-marbles verwenden, um Bedingungen wie mergeMap zu testen. Siehe @ngrx/effects Test docs für Beispiele: https://github.com/ngrx/platform/blob/master/docs/effects/testing.md

In Ihrem Fall des Test würde wie folgt aussehen:

actions = hot('-a', { a: new authAction.GetUserAction() }); 

    const expected = cold('-(bc)', { // the () groups the values into the same timeframe 
     b: new authAction.GetUserCompleteAction({}), // put whatever mock value you have here 
     c: new navigationAction.GetLinksCompleteAction('test') 
    }; 

    expect(effects.loadCollection$).toBeObservable(expected); 

Ich würde spalten dann den Test für expect(service.getUser).toHaveBeenCalled(); in einen separaten Testfall zu überprüfen.

Siehe https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md für die hot/cold Syntax.