createSelector возвращает ноль, но только в тестах - PullRequest
0 голосов
/ 06 ноября 2018

У меня тестовый модуль Jasmine на моих селекторах ngrx. Первый работает нормально, но второй всегда возвращает undefined, хотя я вижу, что редуктор работает правильно.

Селекторы выглядят так:

export const selectProductState = createFeatureSelector<State, ProductState> (
  'product'
);

export const selectProductDetailsState = createSelector(
  selectProductState,
  ((state: ProductState) => state.product)
);

export const selectProduct = createSelector(
  selectProductDetailsState,
  ((state: ProductDetails) => state.product)
);

и мои тесты выглядят так:

describe('selectProductDetailsState', () => {
  it('should return state of product store slice', () => {
    let result;

    store.pipe(
      select(fromSelectors.selectProductDetailsState)
    ).subscribe(value => ( result = value ));

    expect(result).toEqual(undefined);

    store.dispatch(new fromActions.LoadProductSummarySuccess(product));

    expect(result).toEqual(
      product
    );
  });
});

describe('selectProduct', () => {
  it('should return the product state', () => {
    let result;

    store.pipe(
      select(fromSelectors.selectProduct)
    ).subscribe(value => ( result = value ));

    expect(result).toEqual(undefined);

    store.dispatch(new fromActions.LoadProductSummarySuccess(product));

    expect(result).toEqual(product);
  });
});

selectProductDetailsState возвращает продукт, как и ожидалось, но selectProduct возвращает неопределенное значение.

Если вам нужно больше моего кода, просто кричите, что вам нужно.

Вот как я настраивал магазин в тестах:

describe('Product summary selectors', () => {
  let store: Store<State>;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        StoreModule.forRoot(fromStore.reducers)
      ]
    });

    store = TestBed.get(Store);
  });
  // tests go here
})

1 Ответ

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

У меня была похожая проблема, и я смог решить ее, включив пустое корневое хранилище, а затем импортировав StoreModule.forFeature для вашего сценария, это выглядело бы примерно так:

describe('Product summary selectors', () => {
  let store: Store<State>;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        StoreModule.forRoot({}),
        StoreModule.forFeature('products', fromStore.reducers)
      ]
    });

    store = TestBed.get(Store);
  });
  // tests go here
})

Не уверен, что это лучшее решение, но это единственное, что сработало для меня.

...