Проблема при тестировании эффектов ngrx с jest и jasmine-marbles

Я использую 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.

Есть предположения?


person Szabolcs    schedule 31.08.2018    source источник


Ответы (1)


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

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);
});
person Kliment Ru    schedule 31.08.2018
comment
В чем конкретно заключается предлагаемое решение? Я изменил jest.fn(_selector => of(null)) на jest.fn().mockImplementationOnce(() => of(null)), но все равно получаю ту же ошибку. - person Szabolcs; 31.08.2018
comment
Попробуйте использовать cold в mockImpl. jest.fn().mockImplementationOnce(() => cold('a', {a: null})) - person Kliment Ru; 31.08.2018
comment
У меня не работает. Похоже, что эффект не может получить поток действий из-за какой-то основной ошибки. - person Szabolcs; 31.08.2018