ReactコンポーネントでFileReader
を使用して、ユーザーが選択したファイルの内容を<input type="file"/>
要素からインポートできるかどうかをテストします。私の下のコードは、壊れたテストの作業コンポーネントを示しています。Jest/Enzymeを使用してReactでファイルタイプ入力の変更ハンドラをテストするにはどうすればよいですか?
私のテストでは、ブロブもFileReader
で「読み込み」できるため、ファイルの代わりにブロブを使用しようとしています。それは有効なアプローチですか?また、問題の一部がreader.onload
が非同期であり、私のテストではこれを考慮する必要があると思われます。どこか約束が必要ですか?あるいは、おそらくFileReader
をjest.fn()
を使用して模擬する必要がありますか?
標準的なリアクションスタックを使用するのが本当に好きです。特にJestとEnzymeを使い、ジャスミンやシノンなどは使用しないでください。はではできませんが、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');
});
[このディスカッション](https://github.com/airbnb/enzyme/issues/426)は、 'addEventListener'を使ってReactのイベント処理戦略をバイパスし、実際に酵素などではサポートされていないことを示唆しているようです。 –
最初のコメントで 'addEventListener'を述べた理由は、' addEventListener'が 'onload'よりもテスト可能であると他のサイトが示唆していたからです。 (リンク?)私が正しく理解していれば、[私の最初のコメントに記載された議論](https://github.com/airbnb/enzyme/issues/426)は、私がまだ仕事をしていないことをテストするためのいくつかの戦略を示唆しているそのような可能な解決策は、React /酵素の通常の使用を超えていると述べている。しかし、少なくとも一つの人が 'addEventListener'を使ったコンポーネントに' mousemove'イベントをテストするのに役立つように見えましたが、多くの詳細は与えられませんでした。 –