[React Testing] Error State with React Testing Library, findBy*

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[React Testing] Error State with React Testing Library, findBy*相关的知识,希望对你有一定的参考价值。

We have the happy path covered for our post editor component, but what happens if there’s an error in saving the user’s information? We should probably show them an error message and give them the chance to try again. Let’s add a new test for this error case and implement some error handling.

 

Component:

import React from react
import { Redirect } from react-router
import { savePost } from ./api

function Editor({ user }) {
  const [isSaving, setIsSaving] = React.useState(false)
  const [redirect, setRedirect] = React.useState(false)
  const [error, setError] = React.useState(null)
  function handleSubmit(e) {
    e.preventDefault()
    const { title, content, tags } = e.target.elements
    const newPost = {
      title: title.value,
      content: content.value,
      tags: tags.value.split(,).map((t) => t.trim()),
      authorId: user.id,
    }
    setIsSaving(true)
    savePost(newPost).then(
      () => setRedirect(true),
      (error) => {
        setIsSaving(false)
        setError(error.data.error)
      },
    )
  }
  if (redirect) {
    return <Redirect to="/" />
  }
  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="title-input">Title</label>
      <input id="title-input" name="title" />

      <label htmlFor="content-input">Content</label>
      <textarea id="content-input" name="content" />

      <label htmlFor="tags-input">Tags</label>
      <input id="tags-input" name="tags" />

      <button type="submit" disabled={isSaving}>
        Submit
      </button>

      {error ? <div role="alert">{error}</div> : null}
    </form>
  )
}

export { Editor }

 

Test:

test(should render an error message from the server, async () => {
  const testError = test error
  mockSavePost.mockRejectedValueOnce({ data: { error: testError } })
  const fakeUser = userBuilder()
  const { getByText, findByRole } = render(<Editor user={fakeUser} />)
  const submitButton = getByText(/submit/i)

  fireEvent.click(submitButton)
  const postError = await findByRole(‘alert‘)
  expect(postError).toHaveTextContent(testError)
  expect(submitButton).not.toBeDisabled()
})

 

findBy*: they are async function, uses for looking DOM element come in async

以上是关于[React Testing] Error State with React Testing Library, findBy*的主要内容,如果未能解决你的问题,请参考以下文章

[React Testing] Test componentDidCatch handler Error Boundaries

无法使用 react-testing-library 运行测试“无法在模块外使用 import 语句”错误

react-testing-library - 屏幕与渲染查询

[React Testing] Test your Custom Hook Module with react-hooks-testing-library

使用 `react-testing-library` 和 `cypress` 有啥区别?

使用 Cypress 和 React-testing-library 设置 CircleCI