У меня довольно сложная структура селекторов в моем проекте (некоторые селекторы могут иметь до 5 уровней вложенности), поэтому некоторые из них очень сложно протестировать с передачей входного состояния, и я хотел бы вместо этого имитировать входные селекторы.Однако я обнаружил, что это на самом деле невозможно.
Вот самый простой пример:
// selectors1.js
export const baseSelector = createSelector(...);
-
// selectors2.js
export const targetSelector = createSelector([selectors1.baseSelector], () => {...});
Что бы я хотел иметь в своемнабор тестов:
beforeEach(() => {
jest.spyOn(selectors1, 'baseSelector').mockReturnValue('some value');
});
test('My test', () => {
expect(selectors2.targetSelector()).toEqual('some value');
});
Но этот подход не будет работать, так как targetSelector
получает ссылку на selectors1.baseSelector
во время инициализации selectors2.js
и макет назначается selectors1.baseSelector
после него.
Сейчас я вижу 2 рабочих решения:
- Смоделируйте весь
selectors1.js
модуль с jest.mock
, однако, он не будет работать, если мне нужно будет изменить selectors1.baseSelector
вывод для некоторых конкретных случаев - Оберните все селекторы зависимостей следующим образом:
export const targetSelector = createSelector([(state) => selectors1.baseSelector(state)], () => {...});
Но мне не нравится этот подход по очевидным причинам.
Итак, вопрос в следующем: есть ли шанс правильно сменить селекторы для проверки юнитов?