如何使用NgRx MockStore setState?

问题描述 投票:0回答:1

[当我在MockStore进行单元测试时,我在MockStore上使用setState时,它似乎无法单独工作。请参阅以下代码。此代码有效。但这并非没有首先调用store.setState({});的情况。这感觉很hack。为什么要这样做,还是我做错了?

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;,并像在the docs provideMockStore({ initialState })中一样提供给TestBed。

angular typescript unit-testing state ngrx-store
1个回答
0
投票

我认为问题是,您直接变异了state.library对象,而没有先前的store.setState({}),您将发送state.librarysame reference,这可能会导致某些意外结果。

例如,如果您有使用createSelector创建的选择器,并且libraryprojection function参数的一部分,您将获得先前计算的结果,因为prevArguments.library对象具有与currentArguments.library相同的参考。

setState({})就像深度刷新,因为您要发送一个全新的引用。

[setState(state)是与{}不同的参考,因此应重新运行每个选择器的投影功能。

我认为如果没有setState({}),它应该可以正常工作:

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

store.setState(state);
© www.soinside.com 2019 - 2024. All rights reserved.