angular / ngrx store 4: деинициализировать состояние в тесте компонентов

Мне нужно реализовать ngrx / store (версия 4.0.3) в существующем приложении angular (версия 4.3.3).

У меня проблемы с тестированием компонента из-за этого сообщения об ошибке:

TypeError: undefined is not an object (evaluating 'state.search.results')

Прочитав этот документ Предоставление магазина для тестирования, я подумал реализация должна быть простой.

В моем файле спецификации я импортировал StoreModule в методе beforeEach:

StoreModule.forRoot ({reducers}),
...
store = TestBed.get (Store);
spyOn (store, 'dispatch').and.callThrough ();

Редуктор выглядит так:

import * as fromSearch from './search/search-reducer';
export interface State {
  search: fromSearch.State;
}

export const reducers = {
  search: fromSearch.reducer
};

а вот поиск-редуктор:

export interface State {
  searchTerms: string;
  results: [];
  limit: SearchLimit;
}
// Imported: initialState & initalSearchLimitState
const initialState: State = {
  searchTerms: '',
  results:     [initialState],
  limit:       initalSearchLimitState
};

export function reducer (state = initialState, action: SearchActions.All): State {
  switch (action.type) {
    case SearchActions.SEARCH: {
      return {
        ...state,
        searchTerm: action.payload
      };
    }

    case SearchActions.SEARCH_SUCCESS: {
      return {
        ...state,
        results: action.payload
      };
    }

    case SearchActions.SEARCH_LIMIT_EXCEEDED: {
      return {
        ...state,
        limit: action.payload
      };
    }

    default: {
      return state;
    }
  }
}

В методе компонента я отправляю конкретное действие в подписку метода службы поиска (HTTP-запрос):

this._searchService.search (query).subscribe (results => {
    this._store.dispatch (new SearchActions.SearchSuccess (results.data));
});

В файле спецификации поисковая служба - это фиктивная служба.

Прочитав множество ответов на этом сайте, я попытался отправить конкретное действие в метод beforeEach для инициализации состояния state.search.results. Но у меня такое же сообщение об ошибке.

Как мне решить эту государственную проблему?

Заранее спасибо.


person Mika    schedule 28.09.2017    source источник


Ответы (1)


Я нашел решение своей проблемы.

Я поменял редуктор с

export const reducers

to

export const reducers: ActionReducerMap<State>

Кроме того, я добавил начальное состояние в массив импорта метода beforeEach.

person Mika    schedule 01.10.2017
comment
Не могли бы вы объяснить больше или у вас есть код для установки начального состояния в вашем файле спецификации? - person Kevin Lee; 25.03.2018
comment
Извините, я закончил этот проект в прошлом году, и у меня нет исходного кода. Если у вас есть проблемы с тестированием и начальным состоянием, вы можете изучить эту ссылку: toddmotto.com/ngrx -store-testing-reducer. Это простое объяснение того, как тестировать. - person Mika; 25.03.2018