我很难学习如何使用笑话。我遇到的所有教程都教你如何测试一个渲染到诸如<App />
之类的脚本,有或没有快照。其他教程讨论了如何使用输入模拟测试。但我似乎无法找到解释清楚的教程并提供我可以使用的示例。
例如下面的脚本我知道如何测试渲染部分,但我不知道如何测试redux或其他函数。
有没有人可以举例说明如何测试下面的脚本,我可以将其作为我需要在项目中测试的其他文件的参考?
import React, { Component } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import CustomSearch from '../Components/CustomSearch';
import CustomToolBar from '../Components/CustomToolBar';
import Table from '../Components/Table';
import InsertButton from '../Components/InsertButton';
import UserForm from './UserForm ';
import { fetchUsers, deleteUser } from '../../actions/users';
import setModal from '../../actions/modal';
import TableColumns from '../../constants/data/TableColumns';
class Users extends Component {
constructor(props) {
super(props);
this.onInsert = this.onInsert.bind(this);
this.onDelete = this.onDelete.bind(this);
this.onEdit = this.onEdit.bind(this);
this.props.fetchUsers({ accountId: this.props.userData.account.id, token: props.userData.token });
}
onDelete(row) {
if (confirm(`Are you sure you want to delete user ${row.first} ${row.last}?`)) {
this.props.deleteUser({
registered: row.registered,
id: row.id,
accountId: this.props.userData.account.id,
token: this.props.userData.token
});
}
}
onEdit(row) {
console.log(row);
const modal = () => (<UserForm data={row} isEdit />);
this.props.setCurrentModal(modal, 'Existing User Form');
}
onInsert() {
const modal = () => (<UserForm />);
this.props.setCurrentModal(modal, 'Add New User');
}
render() {
const options = {
searchField: (props) => (<CustomSearch {...props} />),
insertBtn: () => (<InsertButton onClick={this.onInsert} />),
toolBar: (props) => (<CustomToolBar {...props} />),
onDelete: this.onDelete,
onEdit: this.onEdit,
};
return (
<Table data={this.props.users} columns={TableColumns.USERS} options={options} title="Users" />
);
}
}
User.propTypes = {
setCurrentModal: PropTypes.func.isRequired,
fetchUsers: PropTypes.func.isRequired,
deleteUser: PropTypes.func.isRequired,
userData: PropTypes.object.isRequired,
users: PropTypes.array,
};
const mapStateToProps = (state) => ({
userData: state.userData.data,
users: state.tableData.users,
});
const mapDispatchToProps = (dispatch) => ({
fetchUsers: (data) => dispatch(fetchUsers(data)),
deleteUser: (data) => dispatch(deleteUser(data)),
setCurrentModal: (modal, title) => dispatch(setModal(modal, title, null, true)),
});
export default connect(mapStateToProps, mapDispatchToProps)(User);
答案 0 :(得分:3)
您应该测试原始组件,因为它清楚redux的工作原理,因此您不必测试它。如果由于某种原因您想要测试mapStateToProps
或mapDispatchToProps
,请将它们单独导出并单独测试。
因此,如果您像这样导出原始组件:
export { Users }; // here you export raw component without connect(...)
export default connect(mapStateToProps, mapDispatchToProps)(Users);
然后,您可以通过导入命名导出(例如
)将其作为标准反应组件进行测试import { Users } from './Users';
describe('Users', () => ....
it('should render', () => ...
如果您想测试connected
组件,因为您不想要shallow
渲染,并且可能渲染了大量嵌套的连接组件,则需要使用{{1并为它创建一个商店。
您可以使用将为您应用中间件的redux-mock-store来帮助自己。
在Recipes > Writing tests的官方redux文档中,一切都得到了很好的解释,所以我的建议是仔细阅读整章。您还可以在那里阅读有关测试动作创建者,缩减器以及更高级概念的信息。
为了阅读更多内容并获得更好的背景,我建议您从官方的redux / react-redux回购中检查以下2条评论。
评论的直接链接:https://github.com/reactjs/react-redux/issues/325#issuecomment-199449298
评论的直接链接:https://github.com/reactjs/redux/issues/1534#issuecomment-280929259
StackOverflow上的相关问题: