Проблема при тестировании эффектов ngrx с помощью jest и jasmine-marbles - PullRequest
0 голосов
/ 31 августа 2018

Я использую jest и jasmine-marbles для проверки моего ngrx-effects. Пока все хорошо, но у меня есть особый случай, когда мне нужно использовать withLatestFrom для доступа к Store внутри эффекта, подобного этому:

@Effect()
createDataSourceSuccess$ = this.actions$
  .ofType<sourceActions.CreateDataSourceSuccess>(
    sourceActions.DataSourceActionTypes.CreateDataSourceSuccess
  )
  .pipe(
    map(action => action.dataSource),
    withLatestFrom(this.store.select(getSourceUploadProgress)),
    switchMap(([source, progress]: [DataSource, UploadProgress]) =>
     of(
        new sourceActions.StartSourceUploadProgress({
          id: source.fileId,
          uploadProgress: progress,
        })
      )
    )
  );

Также я настроил свой тест так:

it('should return StartSourceUploadProgress for CreateDataSourceSuccess', () => {
  const dataSource = dataSources[0];
  const action = new dataSourceActions.CreateDataSourceSuccess(dataSource);
  const outcome = new dataSourceActions.StartSourceUploadProgress({
    id: dataSource.fileId,
    uploadProgress: null,
  });

  store.select = jest.fn(_selector => of(null));

  actions.stream = hot('-a-', { a: action });
  const expected = cold('--b', { b: outcome });

  expect(effects.createDataSourceSuccess$).toBeObservable(expected);
});

Я бы также отметил, что я успешно настроил макеты для Store и Actions, так как все остальные тесты работают нормально. Единственная разница между этим и другими заключается в том, что Store и withLatestFrom не присутствуют в этих эффектах.

Наконец, это вывод ошибки:

 DataSourceEffects › should return StartSourceUploadProgress for CreateDataSourceSuccess

    TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

Есть мысли?

1 Ответ

0 голосов
/ 31 августа 2018

Это решение работает для меня

it('should return StartSourceUploadProgress for CreateDataSourceSuccess', () => {
  const dataSource = dataSources[0];
  const action = new dataSourceActions.CreateDataSourceSuccess(dataSource);
  const outcome = new dataSourceActions.StartSourceUploadProgress({
    id: dataSource.fileId,
    uploadProgress: null,
  });

  actions.stream = hot('-a-', { a: action });
  const expected = cold('--b', { b: outcome });

  store.select = jest.fn().mockImplementationOnce(() => of(new SourceUploadProgress()));

  expect(effects.createDataSourceSuccess$).toBeObservable(expected);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...