【发布时间】:2017-06-01 20:34:14
【问题描述】:
我想测试我的 React 组件是否可以使用 FileReader 从 <input type="file"/> 元素导入用户选择的文件的内容。下面的代码显示了一个测试失败的工作组件。
在我的测试中,我尝试使用 blob 作为文件的替代品,因为 FileReader 也可以“读取” blob。这是一种有效的方法吗?我还怀疑部分问题是reader.onload 是异步的,我的测试需要考虑到这一点。我需要在某个地方做出承诺吗?或者,我是否可能需要使用jest.fn() 模拟FileReader?
我真的更喜欢只使用标准的 React 堆栈。特别是我想使用 Jest 和 Enzyme 而不必使用,比如 Jasmine 或 Sinon 等。但是,如果你知道 不能 用 Jest/Enzyme 但 可以 以另一种方式完成,这也可能会有所帮助。
MyComponent.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');
});
【问题讨论】:
-
This discussion 似乎暗示使用
addEventListener绕过了 React 处理事件的策略,因此例如酶并不真正支持。 -
我在第一条评论中提到
addEventListener的原因是因为其他网站建议addEventListener可能比onload更可测试。 (链接?)如果我理解正确,that discussion mentioned in my first comment 建议了一些我还没有开始工作的其他测试策略,但它指出这些可能的解决方案超出了 React/enzyme 的常规使用范围。但是,它似乎确实帮助至少一个人在使用addEventListener但没有提供很多细节的组件上测试mousemove事件。
标签: javascript reactjs filereader jestjs enzyme