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.
Ejemplos de componentes de React burlones.
Echemos otro vistazo a los componentes con los que estamos trabajando: BlogPage
y PostContent
.
Aqui esta BlogPage
:
const getPostIdFromUrl = url =>
url.substr(url.lastIndexOf("/") + 1)
export const BlogPage = ({ url }) => {
const id = getPostIdFromUrl(url)
return (
<PostContent id={id} />
)
}
BlogPage
no hace mucho más que mostrar PostContent
. Pero tiene alguna funcionalidad que nos interesa, a saber, analizar los accesorios url
para obtener un id
mensaje.
PostContent
un poco más complicado: llama a una función integrada en el navegador fetch
para 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 PostContent
no 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 />
)
, .
, .
: .
: , . , .
. , .