Я смотрю тесты для моего сайта Gatsby, где у меня есть компонент домашней страницы. Который отображает макет и сам контент домашней страницы. Сам по себе макет отображает нижний колонтитул и заголовок.
Макет использует запрос stati c для имени сайта, а нижний колонтитул и заголовок используют запросы stati c для содержимого нижнего колонтитула и структуры меню заголовка.
В настоящее время я могу только смоделировать один из запросов stati c, как показано в примере ниже. Как я могу смоделировать все эти три запроса c? И каков наилучший метод / лучший способ для насмешки над всеми этими тремя запросами c?
Мой текущий тест выглядит следующим образом:
import React from "react"
import renderer from "react-test-renderer"
import { useStaticQuery } from "gatsby"
import Homepage from "../src/pages/index"
beforeEach(() => {
useStaticQuery.mockImplementationOnce(() => ({
"site": {
"siteMetadata": {
"title": "Test title"
}
}
}))
})
describe("Homepage", () => {
it("renders correctly", () => {
const data = {
"homePageData": {
"edges": [{
"node": {
"frontmatter": {
"title": "This is the title",
"description": "Test description",
"techstack": [{"label": "C#"}],
}
}
}]
}
}
const tree = renderer
.create(<Homepage data={data}/>)
.toJSON()
expect(tree).toMatchSnapshot()
})
})
Это успешно проверяет макет stati c запрос. Но происходит сбой в запросах нижнего колонтитула и заголовка stati c, поскольку они не являются поддельными Со следующей ошибкой:
TypeError: Cannot read property 'footerData' of undefined
Мой компонент макета выглядит следующим образом:
import React from "react"
import PropTypes from "prop-types"
import { useStaticQuery, graphql } from "gatsby"
import Header from "./header"
import Footer from "./footer"
import "../../styles/main.scss"
const Layout = ({ children, hideSearchBar = false, sectionClass = "" }) => {
const data = useStaticQuery(graphql`
query SiteTitleQuery {
site {
siteMetadata {
title
}
}
}
`)
return (
<>
<Header siteTitle={data.site.siteMetadata.title} hideSearchBar={hideSearchBar} />
<section className={`section ${sectionClass}`}>
{children}
</section>
<Footer />
</>
)
}
Layout.propTypes = {
children: PropTypes.node.isRequired,
}
export default Layout
Мой нижний колонтитул выглядит так:
import React from "react"
import { useStaticQuery, graphql } from "gatsby"
export default () => {
const data = useStaticQuery(graphql`
query FooterContentQuery {
footerData: allMarkdownRemark(filter: { frontmatter: { templateKey: { eq: "footer" } } }) {
edges {
node {
frontmatter {
text
}
}
}
}
}
`)
const { frontmatter: footer } = data.footerData.edges[0].node
return (
<footer>
<div className="container has-text-centered">
<hr/>
<p>
Copyright © {new Date().getFullYear()} - <span dangerouslySetInnerHTML={{ __html: footer.text }} />
</p>
</div>
</footer>
)
}