【发布时间】:2019-07-09 20:26:32
【问题描述】:
因此,我正在从基于类的组件转移到功能组件,但是在使用 jest/enzyme 为功能组件内部显式使用钩子的方法编写测试时卡住了。这是我的代码的精简版。
function validateEmail(email: string): boolean {
return email.includes('@');
}
const Login: React.FC<IProps> = (props) => {
const [isLoginDisabled, setIsLoginDisabled] = React.useState<boolean>(true);
const [email, setEmail] = React.useState<string>('');
const [password, setPassword] = React.useState<string>('');
React.useLayoutEffect(() => {
validateForm();
}, [email, password]);
const validateForm = () => {
setIsLoginDisabled(password.length < 8 || !validateEmail(email));
};
const handleEmailChange = (evt: React.FormEvent<HTMLFormElement>) => {
const emailValue = (evt.target as HTMLInputElement).value.trim();
setEmail(emailValue);
};
const handlePasswordChange = (evt: React.FormEvent<HTMLFormElement>) => {
const passwordValue = (evt.target as HTMLInputElement).value.trim();
setPassword(passwordValue);
};
const handleSubmit = () => {
setIsLoginDisabled(true);
// ajax().then(() => { setIsLoginDisabled(false); });
};
const renderSigninForm = () => (
<>
<form>
<Email
isValid={validateEmail(email)}
onBlur={handleEmailChange}
/>
<Password
onChange={handlePasswordChange}
/>
<Button onClick={handleSubmit} disabled={isLoginDisabled}>Login</Button>
</form>
</>
);
return (
<>
{renderSigninForm()}
</>);
};
export default Login;
我知道我可以通过导出 validateEmail 来编写测试。但是测试validateForm 或handleSubmit 方法呢?如果它是基于类的组件,我可以只是浅化组件并从实例中使用它
const wrapper = shallow(<Login />);
wrapper.instance().validateForm()
但这不适用于功能组件,因为无法以这种方式访问内部方法。是否有任何方法可以访问这些方法,或者在测试时是否应将功能组件视为黑盒?
【问题讨论】:
-
我删除了我的旧答案,因为它是错误的,对不起...顺便说一句:是的,功能组件在测试时是黑盒子
标签: reactjs typescript jestjs enzyme react-hooks