вам не нужно взаимодействовать с внутренними компонентами; вместо этого лучше использовать публичный интерфейс: реквизит и результат рендеринга
test('should update input value', () => {
expect(findByTestAttr(wrapper, 'search-input').dive().props().value).toEqual('');
findByTestAttr(wrapper, 'search-input').dive().props().onChange({ target: {value: '_test_'} });
expect(findByTestAttr(wrapper, 'search-input').dive().props().value).toEqual('_test_');
}
Видите, вам не нужно проверять, был ли вызван какой-то внутренний метод, каково его имя или аргумент. Если вы получаете то, что вам нужно - и вам требуется <input>
с ожидаемым value
- не имеет значения, как это произошло.
Но если функция передается извне (через props
), вы определенно захотите проверить, вызывается ли она в каком-то ожидаемом случае
test('should call getUserInputRequest prop on keyUp event', () => {
const getUserInputRequest = jest.fn();
const mockedEvent = { target: { key: 'A' } };
const = wrapper = shallow(<UnconnectedSearchInput getUserInputRequest={getUserInputRequest } />).dive()
findByTestAttr(wrapper, 'search-input').dive().props().onKeyUp(mockedEvent)
expect(getUserInputRequest).toHaveBeenCalledTimes(1);
expect(getUserInputRequest).toHaveBeenCalledWith(mockedEvent);
}
[UPD] выглядит как кеширующий селектор в промежуточной переменной, например
const input = findByTestAttr(wrapper, 'search-input').dive();
input.props().onChange({ target: {value: '_test_'} });
expect(input.props().value).toEqual('_test_');
не проходит, поскольку input
относится к устаревшему старому объекту, где value
не обновляется.
На ферментном github мне ответили , что это ожидаемое поведение:
Это предполагаемое поведение в ферменте v3 - см. https://github.com/airbnb/enzyme/blob/master/docs/guides/migration-from-2-to-3.md#calling-props-after-a-state-change.
Так что да, именно так - все должно быть заново найдено из корня, если что-то изменилось.