Redux ReactアプリケーションをテストするときにJestが非常に役立つことがわかりました。しかし、非同期アクションの作成者をテストする方法の例はたくさんありますが、非同期コンポーネントのスナップショットを作成する方法は実際には分かりません。JestとReduxを使用した非同期コンポーネントのスナップショット
私がしたいのは、hovered link example from Facebook's own tutorialに似ています。彼らは、props関数onMouseEnter()を呼び出し、続いてスナップショットを取得します。 onMouseEnter()がRedux Thunkで作成された非同期アクションをディスパッチする場合、簡単な方法がありますか?
これは私のサンクがアキシャスを使用するように見える方法です。
// test-api.js
export function getLinkInfo() {
return function(dispatch) {
return axios.get('/api/get-link-info')
.then(response => {
dispatch(getLinkInfoSuccess(response.data));
return response;
});
};
}
ここに自分のリンクコンポーネントがあります。
import React from 'react';
import { connect } from 'react-redux';
import * as api from '../../api/test-api';
class Link extends React.Component {
render() {
return (
<a href='#' onMouseEnter={this.props.getLinkInfo}>
Hover me
</a>
<div>{this.props.linkInfo}</div>
);
}
}
const mapDispatchToProps = function(dispatch) {
return {
getLinkInfo: function() {
dispatch(api.getLinkInfo());
}
}
}
const mapStateToProps = function(store) {
return {
linkInfo: store.getIn(['testState', 'linkInfo'], "")
};
};
export default connect(mapStateToProps, mapDispatchToProps)(Link);
最後にテストファイル。
import React from 'react';
import Link from '../link';
import renderer from 'react-test-renderer';
test('Link changes linkInfo when hovered',() => {
const component = renderer.create(
<Link></Link>
);
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
// manually trigger the callback
tree.props.onMouseEnter();
// re-rendering
tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
ありがとうございました。バックエンドとReduxフロー全体を単一のテストでテストする理由は、バックグラウンドで実行できる自動ブラウザGUIテストに代わるものでした。だから私は基本的にJestでコンポーネントが再レンダリングするのを待つことができる待機メソッドが必要になります。それは本当に悪い考えですか? –
この種のテストを行うのは悪い考えではありませんが、セレンやサイプレスのような統合テストのためのより良いツールがあります。 –