Formato de simulación de componente de React básico

Anticipándonos al inicio del curso  "Automatización de pruebas en JavaScript", continuamos publicando la traducción de una serie de artículos útiles.


En la primera parte de esta serie, analizamos por qué las simulaciones son realmente útiles.

En esta parte cubriré el formato básico de las amapolas del componente React.

Todos los ejemplos de código para este artículo están disponibles en este repositorio.

dirv / mocking-react-componentes

Ejemplos de componentes de React burlones.

Echemos otro vistazo a los componentes con los que estamos trabajando: BlogPagey PostContent.

Aqui esta BlogPage:

const getPostIdFromUrl = url =>
  url.substr(url.lastIndexOf("/") + 1)

export const BlogPage = ({ url }) => {

  const id = getPostIdFromUrl(url)

  return (
    <PostContent id={id} />
  )
}

BlogPageno hace mucho más que mostrar PostContent. Pero tiene alguna funcionalidad que nos interesa, a saber, analizar los accesorios urlpara obtener un idmensaje.

PostContentun poco más complicado: llama a una función integrada en el navegador fetchpara obtener el texto de una publicación de blog desde una URL /post?id=${id}, donde id es el accesorio que se le pasa.

export const PostContent = ({ id }) => {
  const [ text, setText ] = useState("")

  useEffect(() => {
    fetchPostContent(id)
  }, [id])

  const fetchPostContent = async () => {
    const result = await fetch(/post?id=${id})
    if (result.ok) {
      setText(await result.text())
    }
  }

  return <p>{text}</p>
}

De hecho, lo que hace PostContentno importa, ¡porque no lo volveremos a ver!

BlogPage BlogPage.test.js. PostContent, .

, PostContent, BlogPage.test.js , PostContent.

PostContent:

import { PostContent } from "../src/PostContent"

jest.mock("../src/PostContent", () => ({
  PostContent: jest.fn(() => (
    <div data-testid="PostContent" />
  ))
}))

.

  • jest.mock. . , import . Jest . , ../src/PostContent .

  • , , , .

  • jest.fn (spy): , , . toHaveBeenCalled toHaveBeenCalledWith.

  • jest.fn -, ( ).

  • , . React div - HTML , , !

  • data-testid, , DOM.

  • React Testing Library data-testid , , , , , . , .

  • data-testid . PostContent. , .

React . 90% ( ) . 10% , .

, , BlogPage.

, DOM

describe("BlogPage", () => {
  it("renders a PostContent", () => {
    render(<BlogPage url="http://example.com/blog/my-web-page" />)
    expect(screen.queryByTestId("PostContent"))
      .toBeInTheDocument()
  })
})

, . screen.queryByTestId DOM data-testid PostContent.

, , PostContent .

queryByTestId

, queryByTestId. React Testing Library : -, , getBy queryBy, -, , ID .

, - , queryByTestId. , TestId . : , . , .

: <div data-testid="ComponentName" /> - , .

getBy* queryBy*

getBy , . , , (expect).

, :

expect(screen.getByTestId("PostContent"))
  .toBeInTheDocument()

<PostContent />, getByTestId. !

, , .

, TDD ( ), . queryBy.

,

, , , PostContent.

it("constructs a PostContent with an id prop created from the url", () => {
  const postId = "my-amazing-post"
  render(<BlogPage url={http://example.com/blog/${postId}} />)
  expect(PostContent).toHaveBeenCalledWith(
    { id: postId },
    expect.anything())
})

Jest, toHaveBeenCalledWith, , PostContent , .

React , ref . .

JSX <PostContent id="my-amazing-post" /> PostContent ({id: "my-amazing-post"}).

, , .

expect.anything toHaveBeenCalledWith

, React , - (ref). , expect.anything(), , .

expect.anything(), Jest, .

, toHaveBeenCalled

, . toHaveBeenCalled toHaveBeenCalledWith.

. , :

  • jest.fn , , , <div />.

  • data-testid, DOM.

  • . , PostContent <div data-testid = "PostContent" />.

  • : , DOM, , .

?

, . ?

DOM, , :

export const BlogPost = () => {
  PostContent({ id: "my-awesome-post" })
  return null
}

- . : , , JSX . , , .

, , ?

:

export const BlogPost = () => (
  <PostContent />
)

, .

, .

: .

: , . , .

. , .


- : " puppeteer".

:




All Articles