[当我在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。
我认为问题是,您直接变异了state.library
对象,而没有先前的store.setState({})
,您将发送state.library
的same reference,这可能会导致某些意外结果。
例如,如果您有使用createSelector
创建的选择器,并且library
是projection function参数的一部分,您将获得先前计算的结果,因为prevArguments.library
对象具有与currentArguments.library
相同的参考。
setState({})
就像深度刷新,因为您要发送一个全新的引用。
[setState(state)
是与{}
不同的参考,因此应重新运行每个选择器的投影功能。
我认为如果没有setState({})
,它应该可以正常工作:
state = {
...state,
library: {
...state.library,
bookIdSelected: bookId,
}
};
store.setState(state);