Следующий seo-тест с библиотекой тестирования react

#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;
    }
  };
});