NGXS: Как проверить, было ли отправлено действие? - PullRequest
0 голосов
/ 28 июня 2018

Как проверить, отправлено ли действие?

Например, в LogoutService у меня есть этот простой метод:

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

Мне нужно написать модульный тест, который проверяет отправку двух действий:

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

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

Как я могу проверить отправленные действия?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

@ Ответ Брампэджа возвращает ложные срабатывания для меня (angular7, ngxs 3.3).

Есть еще одна проблема, код:

ofActionDispatched(ResetStateAction, LogoutAction)

кажется равным "сказать, было ли отправлено действие ResetStateAction ИЛИ LogoutAction".

Я пробовал так:

3. Проверьте, если действия называются

// ...
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 голосов
/ 02 августа 2018

Как сказал @Garth Mason, вы можете проверить, вызывались ли действия с потоками действий .

1. Создать переменную actions$

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

  // ...
});

2. Инициализируйте переменную actions$ с наблюдаемой

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

3. Проверьте, если действия называются

Отфильтруйте свои действия из потока с помощью операторной функции ofActionsDispatched() и воспользуйтесь выполненным обратным вызовом.

// ...
it('should call actions ResetStateAction and LogoutAction', async( () => {
  store.dispatch([new ResetStateAction(), new LogoutAction()]);

  actions$.pipe(ofActionDispatched(ResetStateAction, LogoutAction))
  .subscribe((actions) => {
    expect(actions).toBeTruthy();
  });
}));
// ...

Эта спецификация не запустится, пока не будет вызвана функция done в вызове beforeEach выше. И эта спецификация не будет завершена, пока не будет вызвано ее действие.

Из документации Жасмин .

...