Я не вижу ничего, что могло бы сделать тест неудачным ... кроме как исключая this.setState({ comment: "" });
в обратном вызове handleSubmit
.
Если вы используете state
, то вам придется вручнуюсбросьте его (или если компонент размонтируется, то он автоматически потеряет state
).Реакт работает, манипулируя виртуальным DOM
.Затем вы используете state
для управления элементами в этом виртуальном DOM
.Так как вы запрещаете обновление страницы (e.preventDefault
), state
сохраняется как положено.
Рабочий пример (нажмите вкладку Tests
- рядом с вкладкой Browser
- для запуска теста):
компоненты / CommentBox
import React, { Component } from "react";
class CommentBox extends Component {
state = { comment: "" };
handleChange = ({ target: { value } }) => {
this.setState({ comment: value });
};
handleSubmit = e => {
e.preventDefault();
console.log("submitted comment: ", this.state.comment);
this.setState({ comment: "" });
};
render = () => (
<div className="app">
<form onSubmit={this.handleSubmit}>
<h4>Add a comment</h4>
<textarea
className="uk-textarea"
onChange={this.handleChange}
value={this.state.comment}
/>
<div className="button-container">
<button type="submit" className="uk-button uk-button-primary">
Submit Comment
</button>
</div>
</form>
</div>
);
}
export default CommentBox;
компоненты / CommentBox / __ tests __ / CommentBox.test.js
import React from "react";
import { mount } from "enzyme";
import CommentBox from "../index";
describe("Comment Box", () => {
let wrapper;
beforeEach(() => {
wrapper = mount(<CommentBox />);
});
afterEach(() => {
wrapper.unmount();
});
it("when form is submitted, text area gets emptied", () => {
wrapper.find("textarea").simulate("change", {
target: { value: "new comment" }
});
expect(wrapper.find("textarea").prop("value")).toEqual("new comment");
wrapper.find("form").simulate("submit", {
preventDefault: () => {}
});
expect(wrapper.find("textarea").prop("value")).toEqual("");
});
});