Как использовать NgRx MockStore setState? - PullRequest
0 голосов
/ 09 мая 2020

Когда я нахожусь в модульном тесте с MockStore и использую setState в MockStore, кажется, что он не работает сам по себе. См. Следующий код. Этот код работает. Но этого не произошло бы без предварительного вызова store.setState({});. Это кажется хакерским. Почему это требуется или что я делаю не так?

function setSelectedBook(bookId: string) {
  let state = (store.source as BehaviorSubject<IAppState>).value;
  state = {
    ...state,
  };
  state.library.bookIdSelected = bookId;
  store.setState({});
  store.setState(state);
}

store определяется как let store: MockStore; и предоставляется TestBed так же, как docs provideMockStore({ initialState }).

1 Ответ

1 голос
/ 09 мая 2020

Я думаю, проблема в том, что вы напрямую мутируете объект state.library и без предшествующего store.setState({}) отправляете ту же ссылку из state.library, что может привести к некоторым неожиданные результаты.

Например, если у вас есть селекторы, созданные с помощью createSelector, а library является частью аргументов функции проекции , вы получите ранее вычисленный результат , поскольку объект prevArguments.library имеет ту же ссылку, что и currentArguments.library.

setState({}) похож на более глубокую ссылку sh, поскольку вы отправляете совершенно новую ссылку.

setState(state) - это другая ссылка по сравнению с {}, поэтому каждую функцию проекции селектора следует запускать повторно.

Я думаю, что она должна работать нормально без setState({}), если вы это сделаете:

state = {
  ...state,
  library: {
    ...state.library,
    bookIdSelected: bookId,
  }
};

store.setState(state);
...