Format de simulation de base des composants React

En prévision du lancement du cours  "Test Automation in JavaScript", nous continuons à publier la traduction d'une série d'articles utiles


Dans la première partie de cette série, nous avons examiné pourquoi les simulations sont réellement utiles.

Dans cette partie, je couvrirai le format de base des coquelicots composant React.

Tous les exemples de code de cet article sont disponibles dans ce référentiel.

dirv / mocking-react-components

Exemples de composants React moqueurs.

Jetons un autre regard sur les composants avec lesquels nous travaillons: BlogPageet PostContent.

Voici BlogPage:

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

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

  const id = getPostIdFromUrl(url)

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

BlogPagene fait pas grand-chose d'autre que l'affichage PostContent. Mais il a une fonctionnalité qui nous intéresse, à savoir l'analyse d'un accessoire urlpour obtenir un idmessage.

PostContentun peu plus complexe: il appelle une fonction intégrée du navigateur fetchpour obtenir le texte d'un article de blog à partir d'une URL /post?id=${id}, où id est le prop qui lui est passé.

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>
}

En fait, ce qu'il fait PostContentn'a pas d'importance, car on ne le reverra plus!

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