如何使用 NgRx MockStore setState?

How to use NgRx MockStore setState?

当我在 MockStore 的单元测试中,并且我在 MockStore 上使用 setState 时,它​​似乎无法独立工作。请参见以下代码。此代码有效。但是如果不先调用 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; 并像 the docs provideMockStore({ initialState }).

一样提供给 TestBed

我认为问题在于您直接改变了 state.library 对象而没有先前的 store.setState({}),您会发送 相同的引用 state.library,这可能会导致一些意想不到的结果。

例如,如果您使用 createSelector 创建选择器并且 library 投影函数 参数的一部分,您将得到先前计算的结果,因为 prevArguments.library 对象具有与 currentArguments.library.

相同的引用

setState({}) 就像是 更深入的刷新,因为您发送的是全新的参考资料。

setState(state){}相比是不同的引用,所以每个选择器的投影函数都应该重新运行.

我认为没有 setState({}) 如果你这样做应该可以正常工作:

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

store.setState(state);