У меня довольно сложная структура селекторов в моем проекте (некоторые селекторы могут иметь до 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
, а mock присваивается selectors1.baseSelector
после этого.
Сейчас я вижу 2 рабочих решения:
- Смоделируйте весь модуль
selectors1.js
с помощьюjest.mock
, однако это не сработает, если мне нужно будет изменить выводselectors1.baseSelector
для некоторых конкретных случаев. - Оберните все селекторы зависимостей следующим образом:
export const targetSelector = createSelector([(state) => selectors1.baseSelector(state)], () => {...});
Но мне такой подход не очень нравится по понятным причинам.
Итак, вопрос следующий: есть ли шанс правильно смоделировать селекторы Reselect для модульного тестирования?
selectors2
создает новый экземплярselectors1
, поэтому это не тот экземпляр, который вы издевались с помощью шпионского метода, но вы хотели бы, чтобы он был? Одним из вариантов может быть использование внедрения зависимостей, чтобы вы могли инициализировать его с помощью издевательского экземпляра. Другой может заключаться в том, чтобы издеваться над целевым селектором selector2, чтобы вернуть издевательский экземпляр instance1, но похоже, что вы пытаетесь избежать этого по причинам масштабируемости. Мне кажется, что я, возможно, не понимаю всей области проблемы или, может быть, именно того, что делаетcreateSelector
. Вы уже коснулись использования макета модуля. - person CTS_AE   schedule 17.04.2019