我有一个使用NgRx和@ngrx/router-store
(8.4.0)的Angular 8应用程序(核心8.1.2),但是在模拟由fromRouter.getSelectors(selectRouter)
生成的选择器时遇到了麻烦。
我编写并正在尝试测试的选择器看起来像这样:
export const selectFilteredPagedFeaturedPlaylists = createSelector(
selectFilteredFeaturedPlaylists,
selectRoutePageIndex,
selectPageSize,
(featuredPlaylists, pageIndex, pageSize) => ({
...featuredPlaylists,
content: featuredPlaylists.content.slice(+pageIndex * pageSize, (+pageIndex + 1) * pageSize)
})
);
和selectRoutePageIndex
选择器,调用商店生成的方法,看起来像这样:
export const selectRoutePageIndex = selectRouteParam('pageIndex');
实际上,我不一定要模拟selectRouteParam
选择器,但是我需要模拟我的selectRoutePageIndex
选择器。不幸的是,technique described in the docs似乎不适用于@ngrx/router-store
生成的选择器。
任何想法我该怎么做?
我没有找到问题的答案,但是我已经创建了一种解决方法。我已经将路由器存储的选择器包装在createSelector()
调用中并返回了它。看起来像这样:
export const innerSelectRoutePageIndex = selectRouteParam('pageIndex');
export const selectRoutePageIndex = createSelector(
innerSelectRoutePageIndex,
(routePageIndex) => routePageIndex
);
因此,客户端代码仍然使用selectRoutePageIndex
选择器,并且MockStore.overrideSelector()
对这种安排感到满意。似乎createSelector()
更宽容了它传递的选择器的签名。