如何使用 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);
当我在 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 })
.
我认为问题在于您直接改变了 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);