web-dev-qa-db-ja.com

NGXS:アクションがディスパッチされたかどうかをテストする方法は?

アクションがディスパッチされたかどうかを単体テストするにはどうすればよいですか?

たとえば、LogoutServiceには、次の単純なメソッドがあります。

  logout(username: string) {
    store.dispatch([new ResetStateAction(), new LogoutAction(username)]);
  }

2つのアクションがディスパッチされていることを確認する単体テストを作成する必要があります。

  it('should dispatch ResetState and Logout actions', function () {
    logoutService.logout();

    // how to check the dispactched actions and their parameters?
    // expect(...)
  });

ディスパッチされたアクションを確認するにはどうすればよいですか?

9
Francesco Cina

NGXSパイプ可能演算子

NGXSのアクションはObservableで処理されます。 NGXSはパイプ可能な演算子を提供します。テストにはofActionDispatchedを使用できます。これが NGXSドキュメント から取ったリストです。

  • ofActionは、以下のライフサイクルイベントのいずれかが発生したときにトリガーされます
  • ofActionDispatchedは、アクションがディスパッチされたときにトリガーされます
  • ofActionSuccessfulは、アクションが正常に完了したときにトリガーされます
  • ofActionCanceledは、アクションがキャンセルされたときにトリガーされます
  • ofActionErroredは、アクションによってエラーがスローされたときにトリガーされます
  • ofActionCompletedは、アクションが成功したかどうかに関係なく、アクションが完了したときにトリガーされます(完了の要約を返します)

回答

1。変数_actions$_を作成します

_describe('control-center.state', () => {
  let actions$: Observable<any>;

  // ...
});
_

2。変数_actions$_をobservableで初期化します

_beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [
      NgxsModule.forRoot([AppState]),
      NgxsModule.forFeature([ControlCenterState])
    ]
  });
  store = TestBed.get(Store);
  actions$ = TestBed.get(Actions);
})
_

3.1 1つのアクションが呼び出されたかどうかをテストします:

演算子ofActionsDispatched()を使用して、ストリームからアクションをフィルタリングします。

_it('should dispatch LogoutAction', (done) => {
  actions$.pipe(ofActionDispatched(LogoutAction)).subscribe((_) => {
    done();
  });

  service.logout();
});
_

3.2複数のアクションが呼び出されたかどうかをテストします:

RXJS Zip演算子を使用して、2つのオブザーバブルをofActionsDispatched()関数と結合します(Zip:afterallオブザーバブルが放出し、値をアレイ)。

_it('should dispatch ResetStateAction and LogoutAction', (done) => {
  Zip(
    actions$.pipe(ofActionDispatched(ResetStateAction)),
    actions$.pipe(ofActionDispatched(LogoutAction))
  ).subscribe((_) => {
    done();
  });

  service.logout();
});
_

仕様は、doneが呼び出されるまで完了しません。 doneが呼び出されない場合、タイムアウト例外がスローされます。

Jasmineのドキュメントから

7
Brampage

私はこのアプローチを試し、両方のアクションが呼び出されたかどうかをテストしました:

。アクションが呼び出されているかどうかをテスト

// ...
it('should call actions ResetStateAction and LogoutAction', async( () => {
  let actionDispatched = false;
  Zip(
    actions$.pipe(ofActionDispatched(ResetStateAction)),
    actions$.pipe(ofActionDispatched(LogoutAction))
  )
  .subscribe( () => actionDispatched = true );

  store.dispatch([new ResetStateAction(), new LogoutAction()])
    .subscribe(
      () => expect(actionDispatched).toBe(true)
    );
}));
// ...
0
Claudio Suardi