我想测试我的 React 组件是否可以用于FileReader
从<input type="file"/>
元素导入用户选择的文件的内容。我下面的代码显示了一个测试失败的工作组件。
在我的测试中,我试图使用 blob 作为文件的替代品,因为 blob 也可以被FileReader
. 这是一种有效的方法吗?我还怀疑问题的一部分reader.onload
是异步的,我的测试需要考虑到这一点。我需要在某个地方做出Promise吗?或者,我可能需要FileReader
使用jest.fn()
?
我真的更愿意只使用标准的 React 堆栈。特别是我想使用 Jest 和 Enzyme 而不必使用 Jasmine 或 Sinon 等。但是,如果您知道Jest/Enzyme无法完成某些事情但可以通过其他方式完成,那也可能会有所帮助。
我的组件.js:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {fileContents: ''};
this.changeHandler = this.changeHandler.bind(this);
}
changeHandler(evt) {
const reader = new FileReader();
reader.onload = () => {
this.setState({fileContents: reader.result});
console.log('file contents:', this.state.fileContents);
};
reader.readAsText(evt.target.files[0]);
}
render() {
return <input type="file" onChange={this.changeHandler}/>;
}
}
export default MyComponent;
MyComponent.test.js:
import React from 'react'; import {shallow} from 'enzyme'; import MyComponent from './MyComponent';
it('should test handler', () => {
const blob = new Blob(['foo'], {type : 'text/plain'});
shallow(<MyComponent/>).find('input')
.simulate('change', { target: { files: [ blob ] } });
expect(this.state('fileContents')).toBe('foo');
});