import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types';
const InputComponent = ({ item, data }) => {
const [value, setValue] = useState('');
// Binding values for Edit based on unique Key
useEffect(() => {
if (data && data[item.field] && data[item.field] !== 'undefined') {
setValue(data[item.field]);
}
}, [data,item.field]);
//On change setting state
const setState = e => {
setValue(e.target.value);
};
return (
<div className='Input-Containter' data-test='InputBox-tbl-evt'>
<input
data-test='input-ele'
type='text'
value={value}
onChange={e => setState(e)}
/>
</div>
);
};
InputComponent.propTypes = {
item: PropTypes.object,
data: PropTypes.object
};
InputComponent.defaultProps = {
data: {
id: '1',
name: 'd'
},
item:{
field: 'id',
}
};
export default InputComponent;
有人可以帮我如何测试 useEffect 中的 setValue()
-> 更新了该组件的完整代码
-> 组件将获取一些数据来将值绑定到输入元素中并在同一个
我们也可以编辑其中的值。
首先,让我们仔细看看
useEffect
部分。是什么意思?
input
的值如何测试?更改 prop(s) 并验证
input
的 value
。
基于此,我们可能最多有 3 个(仅更改第一个道具,仅更改第二个道具或两者)* 2(如果结果是
undefined
或不是)* 2(如果已经提供了自定义值并存储在useState
中)或不)= 12。但我认为详尽的测试并不是一个好方法。所以我会将大部分检查放在单个测试用例中:
it('re-init value for nested input after props changes', () => {
const wrapper = mount(<InputComponent />);
function getInput(wrapper) {
return wrapper.find("input").prop("value");
}
expect(getInput(wrapper).props("value")).toEqual("1"); // based on default props
getInput(wrapper).props().onChange({ target: {value: "initial"} }); // imitating manual change
expect(getInput(wrapper).props("value")).toEqual("initial");
wrapper.setProps({data: {a: "some-a", b: "undefined"} });
expect(getInput(wrapper).props("value")).toEqual("initial");
wrapper.setProps({ item: { field: "c" } }); // data[item.field] is undefined
expect(getInput(wrapper).props("value")).toEqual("initial");
wrapper.setProps({ item: {field: "b" } }); // data[item.field] is "undefined"
expect(getInput(wrapper).props("value")).toEqual("initial");
wrapper.setProps({ item: {field: "a" } }); // data[item.field] is meaningful
expect(getInput(wrapper).props("value")).toEqual("some-a");
});
至于
getValue
助手 - 它是必需的,因为我们不能只记住 input
元素本身,例如:
const wrapper = mount(...);
const input = wrapper.find("input");
...
expect(input.prop("value")).toEqual();
...
expect(input.prop("value")).toEqual();
详细信息可以在Enzyme 的文档中找到。或者只是知道我们需要在任何更新后重新运行
find
。
还要注意 Enzyme 的
setProps
不会替换当前的 props ,而是通过合并来更新它们(以及 React 的 setState
对状态的作用)。