【发布时间】:2020-03-26 15:41:52
【问题描述】:
我目前正在使用 Jest 和 Enzyme 测试 React TextArea 组件。这个组件基本上只是一个原生 <textarea> 元素的包装器。它的行为是它会根据其当前值相对于集合max-height 自动调整其高度。这是 onchange 事件处理程序:
handleInputChange = e => {
const { onChange } = this.props;
const field = e.target;
field.style.height = 'inherit';
field.style.height = `${field.scrollHeight}px`;
const max = parseInt(
window.getComputedStyle(field).getPropertyValue('max-height'),
10
);
field.style.overflowY = max < field.scrollHeight ? 'scroll' : 'hidden';
if (onChange) {
onChange(e);
}
};
我想为它写一个单元测试,这样我就可以测试它是否更新了它的高度。我已经对如何将 onchange 事件模拟到输入进行了一些研究,但到目前为止我所看到的是它可以通过传递“部分填充”event 对象(它只有一个值属性)来完成,例如这个:
const spy = jest.spyOn(wrapper.instance(), 'handleInputChange');
const controlledTextArea = findByTestAttr(wrapper, 'controlledTextArea');
controlledTextArea.simulate('change', {
target: {
value: 'This is just for test'
}
});
但这会导致错误,因为我需要访问e.target 的style 属性。
所以我的问题是,我如何模拟一个 onchange 事件,就好像有一个正常的事件对象一样。我希望我能做这样的事情:
controlledTextArea.simulate('change', 'This is another test text');
然后它会自动为我创建event 对象。有没有办法做到这一点?
【问题讨论】: