作为一个新手,我正在学习写一些测试。
我构建了一个简单的组件,它有一个输入和一个按钮,在单击按钮后显示输入的文本
这就是
function Contact() {
const [name, setName] = useState("");
const [show, setShow] = useState(false);
const handleSendContactRequest = (e) => {
e.preventDefault();
setShow(true);
};
return (
<>
<h1>Contact</h1>
<span
data-testid="message"
style={{ visibility: show ? "visible" : "hidden" }}
>
{name} , check your inbox
</span>
<form action="">
<input
type="text"
placeholder="name"
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button onClick={handleSendContactRequest}>Send contact request</button>
</form>
</>
);
}
export default Contact;
字符串
我创建了一个测试来检查span最初是否隐藏,它是否通过,然后再创建一个测试来检查整个流程。
//this test passes. span is not visible
test("span should not be visiblet", () => {
render(<Contact />);
const span = screen.getByTestId("message");
expect(span).not.toBeVisible();
});
test("should display name in the span after clicking the button", () => {
render(<Contact />);
const nameInput = screen.getByPlaceholderText("name");
fireEvent.change(nameInput, { target: { value: "tom" } });
const sendButton = screen.getByText("Send contact request");
const hiddenSpan = screen.queryByText(
"tom , check your account [email protected]"
);
expect(hiddenSpan).toBeNull(); // do not pass. spann is visible after fireEvent.change()
fireEvent.click(sendButton);
const spanElement = screen.getByText("tom , check your inbox");
expect(spanElement).toBeVisible();
});
型
我写的测试正确吗?我不明白为什么span
有内容后,fireEvent.change()
时,以前的测试通过。
1条答案
按热度按时间vnjpjtjt1#
因为我只是显示和隐藏元素,所以像
.findByText()
.queryByText
这样的方法仍然可以访问元素的值,而像.toBeInTheDocument()
或.toBe()
这样的方法将访问元素的innerHTML
和textContent
。只是为了检查
.toBeVisible()
似乎工作正常。我修改了测试:字符串
这个测试将通过,如果我注解掉
fireEvent.click(sendButton);
,它就不会通过。