Jest.js React测试库和Vitest -元素在更新状态之前可见

8nuwlpux  于 8个月前  发布在  Jest
关注(0)|答案(1)|浏览(108)

作为一个新手,我正在学习写一些测试。
我构建了一个简单的组件,它有一个输入和一个按钮,在单击按钮后显示输入的文本
这就是

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()时,以前的测试通过。

vnjpjtjt

vnjpjtjt1#

因为我只是显示和隐藏元素,所以像.findByText().queryByText这样的方法仍然可以访问元素的值,而像.toBeInTheDocument().toBe()这样的方法将访问元素的innerHTMLtextContent
只是为了检查.toBeVisible()似乎工作正常。我修改了测试:

test("should span be visible and contain a name value after clicking button", () => {
  render(<Contact />);
  const span = screen.getByTestId("message");
  expect(span).not.toBeVisible();
  const nameInput = screen.getByPlaceholderText("name");
  const nameInputValue = "Tom";
  const sendButton = screen.getByRole("button");

  fireEvent.change(nameInput, { target: { value: nameInputValue } });
  fireEvent.click(sendButton);

  expect(span).toBeVisible();
  
  expect(span.innerHTML).toBe(
    `${nameInputValue} , check your inbox`
  );
});

字符串
这个测试将通过,如果我注解掉fireEvent.click(sendButton);,它就不会通过。

相关问题