По моему мнению, вам не следует беспокоиться об индивидуальном тестировании методов внутри FC, а скорее о тестировании его побочных эффектов.Например:
it('should disable submit button on submit click', () => {
const wrapper = mount(<Login />);
const submitButton = wrapper.find(Button);
submitButton.simulate('click');
expect(submitButton.prop('disabled')).toBeTruthy();
});
Поскольку вы можете использовать useEffect, который является асинхронным, вы можете захотеть обернуть свое ожидание в setTimeout :
setTimeout(() => {
expect(submitButton.prop('disabled')).toBeTruthy();
});
Еще одна вещь, которую выможет захотеть сделать, это извлечь любую логику, которая не имеет ничего общего с взаимодействием с формой intro чистых функций.Например: вместо:
setIsLoginDisabled(password.length < 8 || !validateEmail(email));
Вы можете выполнить рефакторинг:
Helpers.js
export const isPasswordValid = (password) => password.length > 8;
export const isEmailValid = (email) => {
const regEx = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return regEx.test(email.trim().toLowerCase())
}
LoginComponent.jsx
import { isPasswordValid, isEmailValid } from './Helpers';
....
const validateForm = () => {
setIsLoginDisabled(!isPasswordValid(password) || !isEmailValid(email));
};
....
Таким образомвы можете индивидуально протестировать isPasswordValid
и isEmailValid
, а затем при тестировании компонента Login
вы можете смоделировать ваш импорт .И тогда единственное, что осталось проверить для вашего Login
компонента, это то, что при щелчке будут вызваны импортированные методы, а затем поведение, основанное на этих ответах, например:
- it('should invoke isPasswordValid on submit')
- it('should invoke isEmailValid on submit')
- it('should disable submit button if email is invalid') (isEmailValid mocked to false)
- it('should disable submit button if password is invalid') (isPasswordValid mocked to false)
- it('should enable submit button if email is invalid') (isEmailValid and isPasswordValid mocked to true)
Основное преимущество этогоПодход заключается в том, что компонент Login
должен обрабатывать , обновляя форму , и ничего больше.И это можно проверить довольно прямо.Любая другая логика должна обрабатываться отдельно ( разделение интересов ).