イメージをロードし、イメージが正常にロードされたかどうかを判断するReactコンポーネントを作成しました。Jestを使ってimg.onerrorをテストするにはどうすればいいですか?
import React from 'react';
import PropTypes from 'prop-types';
import { LOADING, SUCCESS, ERROR } from '../helpers';
class Image extends React.Component {
static propTypes = {
onError: PropTypes.func,
onLoad: PropTypes.func,
src: PropTypes.string.isRequired,
}
static defaultProps = {
onError: null,
onLoad: null,
}
constructor(props) {
super(props);
this.state = { imageStatus: LOADING };
this.initImage();
}
componentDidMount() {
this.image.onload = this.handleImageLoad;
this.image.onerror = this.handleImageError;
this.image.src = this.props.src;
}
initImage() {
this.image = document.createElement('img');
this.handleImageLoad = this.handleImageLoad.bind(this);
this.handleImageError = this.handleImageError.bind(this);
}
handleImageLoad(ev) {
this.setState({ imageStatus: SUCCESS });
if (this.props.onLoad) this.props.onLoad(ev);
}
handleImageError(ev) {
this.setState({ imageStatus: ERROR });
if (this.props.onError) this.props.onError(ev);
}
render() {
switch (this.state.imageStatus) {
case LOADING:
return this.renderLoading();
case SUCCESS:
return this.renderSuccess();
case ERROR:
return this.renderError();
default:
throw new Error('unknown value for this.state.imageStatus');
}
}
}
export default Image;
私はJest + Enzymeを使用してテストを作成して、イメージが読み込まれないときをテストしようとしています。
it('should call any passed in onError after an image load error',() => {
const onError = jest.fn();
mount(<Image {...props} src="crap.junk"} onError={onError} />);
expect(onError).toHaveBeenCalled();
});
私が何をしていても、Jestは常にイメージを正常にレンダリングする方法を見つけます。 srcをfalseに設定しても、何らかの形でイメージがレンダリングされます。誰もあなたが画像負荷を失敗するように冗談を強制することができる方法を知っていますか?
私はあなたが何かにいると思っていますが、document.createElementを嘲笑する問題があります。 My Image関数は、引数に応じてspanとdivを作成するので、nullを返すとテストがクラッシュします。今私は、すべての属性を追加できるかどうかをテストしています。動いていない。これは私が得た限りです:https://gist.github.com/mrbinky3000/567b532928f456ee74e55ebe959c66ec – mrbinky3000
私はあきらめました。 wrapper.instance()を使い、instance.image.onerror()を直接呼び出すことにしました。私が過度のテストをしていることが私に起こりました。イメージエラーが発生した場合、HTMLImageElementがonerrorを起動することを信頼する必要があります。そうでない場合は、Webブラウザのソースコードに大きなエラーがあります。その確率:無し。だから私は手動でエラーをシミュレートするためにエラーを発生させた。ケースが閉まった。しかし、ありがとう。 – mrbinky3000