#javascript #reactjs #next.js #meta-tags #react-testing-library
#javascript #reactjs #next.js #мета-теги #react-testing-library
Вопрос:
Я пытаюсь протестировать свой SEO-компонент, который выглядит следующим образом:
export const Seo: React.FC<Props> = ({ seo, title, excerpt, heroImage }) => {
const description = seo?.description || excerpt
const pageTitle = seo?.title || title
const router = useRouter()
return (
<NextSeo // https://www.npmjs.com/package/next-seo
canonical={seo?.canonical}
nofollow={seo?.nofollow}
noindex={seo?.noindex}
title={pageTitle}
description={description}
openGraph={{
title,
description,
type: "article",
...
и мой тест выглядит так:
describe("Seo", () => {
it("should render the meta tags", async () => {
const props = {
title: "title page",
excerpt: "string",
seo: {
title: "seo title",
description: "meta description",
},
heroImage: {
src: "url",
alt: "alt text",
width: 300,
height: 400,
},
}
function getMeta(metaName: string) {
const metas = document.getElementsByTagName("meta")
for (let i = 0; i < metas.length; i = 1) {
if (metas[i].getAttribute("name") === metaName) {
return metas[i].getAttribute("content")
}
}
return ""
}
render(<Seo {...props} />)
await waitFor(() => expect(getMeta("title")).toEqual("title page"))
})
})
однако тест не выполняется: (похоже, что элемент head пуст)
Комментарии:
1. я думаю, что здесь проблема, вам нужно показать в консоли это
document.getElementsByTagName("meta")
2. Правильно, он на самом деле пустой
HTMLCollection {}
Ответ №1:
У меня была такая же проблема, но я нашел этот ответ на GitHub.
Итак, в основном вам нужно издеваться next/head
, переходить document.head
к свойству контейнера render
параметров и, наконец, получить доступ к document
.
Ваш тест закончится так:
jest.mock('next/head', () => {
return {
__esModule: true,
default: ({ children }: { children: Array<React.ReactElement> }) => {
return <>{children}</>;
},
};
});
describe("Seo", () => {
it("should render the meta tags", () => {
const props = {
title: "title page",
excerpt: "string",
seo: {
title: "seo title",
description: "meta description",
},
heroImage: {
src: "url",
alt: "alt text",
width: 300,
height: 400,
},
}
render(<Seo {...props} />, { container: document.head })
expect(document.title).toBe("title page")
})
})
В моем случае я не тестировал его с этой getMeta
функцией, но я считаю, что это тоже сработает.
Ответ №2:
в JS
jest.mock('next/head', () => {
return {
__esModule: true,
default: ({ children }) => {
return children;
}
};
});