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.
Exemples de composants React moqueurs.
Jetons un autre regard sur les composants avec lesquels nous travaillons: BlogPage
et PostContent
.
Voici BlogPage
:
const getPostIdFromUrl = url =>
url.substr(url.lastIndexOf("/") + 1)
export const BlogPage = ({ url }) => {
const id = getPostIdFromUrl(url)
return (
<PostContent id={id} />
)
}
BlogPage
ne 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 url
pour obtenir un id
message.
PostContent
un peu plus complexe: il appelle une fonction intégrée du navigateur fetch
pour 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 PostContent
n'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 />
)
, .
, .
: .
: , . , .
. , .