После некоторых исследований, думаю, я нашел проблему.
Давайте посмотрим на реализацию provideMockStore
:
export function provideMockStore<T = any>(
config: MockStoreConfig<T> = {}
): Provider[] {
return [
ActionsSubject,
MockState,
MockStore,
{ provide: INITIAL_STATE, useValue: config.initialState || {} },
{ provide: MOCK_SELECTORS, useValue: config.selectors },
{ provide: StateObservable, useClass: MockState },
{ provide: ReducerManager, useClass: MockReducerManager },
{ provide: Store, useExisting: MockStore },
];
}
Объект config
, который может быть передан в provideMockStore
, имеет следующую форму:
export interface MockStoreConfig<T> {
initialState?: T;
selectors?: MockSelector[];
}
Как видите, значение в config.initialState
равно присвоено токену INITIAL_STATE
, который далее вводится в Store
(MockStore
в данном случае).
Обратите внимание, как вы его предоставляете:
const initialState: State = {
editedIngredient: null,
editedIngredientIndex: -1
};
provideStore({ initialState })
Это означает, что INITIAL_STATE
будет этим :
{
editedIngredient: null,
editedIngredientIndex: -1
};
Вот как MockStore
выглядит:
constructor(
private state$: MockState<T>,
actionsObserver: ActionsSubject,
reducerManager: ReducerManager,
@Inject(INITIAL_STATE) private initialState: T,
@Inject(MOCK_SELECTORS) mockSelectors: MockSelector[] = []
) {
super(state$, actionsObserver, reducerManager);
this.resetSelectors();
this.setState(this.initialState);
this.scannedActions$ = actionsObserver.asObservable();
for (const mockSelector of mockSelectors) {
this.overrideSelector(mockSelector.selector, mockSelector.value);
}
}
Обратите внимание, что он вводит INITIAL_STATE
. MockState
- это просто BehaviorSubject
. Позвонив по номеру super(state$, actionsObserver, reducerManager);
, вы убедитесь, что когда вы сделаете this.store.pipe()
в своем компоненте, вы получите значение MockState
.
Вот как вы выбираете из магазина:
this.store.select('shoppingList').pipe(...)
но ваше начальное состояние выглядит так:
{
editedIngredient: null,
editedIngredientIndex: -1
};
Имея это в виду, я думаю, вы могли бы решить проблему, если бы вы это сделали:
const initialState = {
editedIngredient: null,
editedIngredientIndex: -1
};
provideMockStore({ initialState: { shoppingList: initialState } })
Кроме того, если вы хотите глубже погрузиться в ngrx/store
, вы можете проверить эту статью .