Допустим, у вас есть следующие данные.
commentData = {
id: 2,
comment_body:'test example'
}
И у вас есть компонент формы, который принимает onSubmit
проп.
Пример формы / комментария
import React from "react";
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';
const Comment = (props) => (
<div>
<form onSubmit={props.onSubmit}>
<TextField
type="text"
id="outlined-multiline-static"
label="Write A Comment"
multiline
name="comment_body"
value={props.commentBody}
rows="10"
fullWidth
margin="normal"
variant="outlined"
onChange={props.commentChange}
/>
{/* <Button type="submit" variant="outlined" component="span" color="primary">
Post A Comment
</Button> */}
<button type="submit" variant="outlined" component="span" color="primary">
Write a Comment
</button>
</form>
</div>
)
export default Comment;
Компонент комментария затем используется в родительском компоненте, подобном этому
.....
class ImageContainer extends React.Component{
state = {
isComment: false,
comment_body: ""
}
handleCommentChange = (e) => {
this.setState({
comment_body: e.target.value
})
}
writeComment = (id) => {
this.setState({
isComment: this.state.isComment ? '' : id // check if you state is filled to toggle on/off comment
})
}
commentSubmit = (event, id) => {
event.preventDefault();
console.log(this.state.comment_body); // doesn't get console.log
// note that commentBody is being used for the req.body as well so its called by req.body.commentBody
const commentBody = this.state.comment_body
const data = {
commentBody,
id
}
this.props.postComment(data);
this.setState({
comment_body: ''
})
}
render(){
const { img, deleteImg, classes } = this.props
return(
<Grid item sm={12} md={12} className={classes.imageGridItem}>
......
<Comment onSubmit={(e) => this.commentSubmit(e, img.id)}
commentBody={this.state.comment_body }
commentChange={this.handleCommentChange}/>
......
</Paper>
</Grid>
)
}
}
const mapDispatchToProps = (dispatch) => ({
postComment: (data) => dispatch(postComment(data))
})
export default compose(connect(mapStateToProps, mapDispatchToProps), withStyles(imageStyles))(ImageContainer)
, данные передаются в действии избыточности, подобном этому
action
// post comment
export const postComment = data => {
return async (dispatch) => {
return Axios.post('/images/newComment', data).then( (response )=> {
const newComment = response.data;
const id = data.id
// console.log(newComment);
dispatch({type:POST_COMMENT, newComment, id })
})
}
}
Как мне провести модульное тестирование?Я знаю, что мне нужно разделить модульный тест как модуль для действия и модульный тест для компонента <Comment/>
.
Это моя попытка модульного тестирования компонента комментария проповеди onSubmit, я делаюэто верно?
В настоящее время тест проходит, но я не уверен, что это правильный способ для модульного теста onSubmit
prop.
Comment.test.js
.....
describe('Should render <Comment/> component', () => {
let wrapper;
beforeEach( () => {
wrapper = shallow(<Comment/>)
})
......
it("should check for onChange method (1)", () => {
const onChangeMock = jest.fn();
const component = shallow(
<Comment commentChange={onChangeMock} commentBody={"test"} />
);
component.find(TextField).at(0).simulate("change", "test");
expect(onChangeMock).toBeCalledWith("test");
});
it('should test onSubmit', () => {
const mockSubmit = jest.fn();
const component = shallow(
<Comment commentBody={'owl'} onSubmit={mockSubmit}/>
);
const props = {
id:2,
comment_body:'test'
}
component.find('form').simulate('submit', props);
expect(mockSubmit).toBeCalledWith({ 'comment_body': "test", "id": 2});
})
})