javascript - 接下来使用 React 测试库进行 seo 测试

标签 javascript reactjs next.js meta-tags 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 元素是空的)

enter image description here

最佳答案

我遇到了同样的问题,但我发现 this answer on GitHub .

所以基本上你需要模拟 next/head,将 document.head 传递给 render 选项的容器属性,最后访问文档

你的测试最终会是这样的:

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 函数对其进行测试,但我相信它也能工作。

关于javascript - 接下来使用 React 测试库进行 seo 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65627461/

相关文章:

javascript - React with Node.js 导出两个函数

reactjs - 使用 headless ui 文档时出现 typescript 错误

javascript - 将模型的属性渲染为 HTML 页面标题

javascript - 子图中溢出的 C3 UI 问题(附截图)

javascript - React Native 和 Expo FS 导入问题

javascript - Next.js 不在服务器端渲染中渲染 CSS

javascript - 使用 Next.js 在两个页面之间保留数据

javascript - 如何从浏览器中的文本中删除可见的HTML语法?

javascript - Controller 内部 undefined variable ($scope 问题)

css - 添加 list-style-type 以响应内联样式